• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:一つ前の値)

XMLとXSLの結果を比較して重複を排除したい

fatbackの回答

  • ベストアンサー
  • fatback
  • ベストアンサー率84% (11/13)
回答No.1

>NAME:A attr:3 >NAME:B attr:1 >NAME:B attr:2 >という結果が得られました。 この結果は正しいのでしょうか? 結果から逆算するとデータは <ALL>  <EX attr='1'><NAME>B</NAME></EX>  <EX attr='2'><NAME>B</NAME></EX>  <EX attr='3'><NAME>A</NAME></EX> </ALL> の書き間違いですね。 -- ●preceding-siblingとkey関数を使ってみる <xsl:key name="NAME" match="EX" use="NAME" /> <xsl:template match="ALL"> <xsl:for-each select="EX[not(NAME = preceding-sibling::EX/NAME)]"> <xsl:sort select="NAME"/> <dt>NAME: <xsl:value-of select="NAME"/> <xsl:for-each select="key('NAME', NAME)"> <xsl:sort select="@attr"/> <dd>attr: <xsl:value-of select="@attr"/></dd> </xsl:for-each> </dt> </xsl:for-each> </xsl:template>

ryogoku
質問者

お礼

すみません!XML間違っていました。 fatbackさんが書いておられる通りでした。 すみません。 おかげ様でできました。 ありがとうございました!!

関連するQ&A

  • value-ofの値を属性値とするには

    やりたいことをストレートに書くとこうなんです。 XSLファイル内 <xsl:for-each select="USERS/USER/">  <input name="UserID" type="hidden" value=" <xsl:value-of select="@ID"/> "/> </xsl:for-each> 当然構文エラーでますよね… この回避方法をご存じの方いませんか? ちなみに <xsl:for-each select="USERS/USER/">  <xsl:value-of select="@ID"/> </xsl:for-each> で、値は取れたんですけど…大雑把な説明で申し訳ありません。

    • ベストアンサー
    • XML
  • お願いします。

    教えてください。 <ALL>  <ITEM>   <ITEMS>一</ITEMS>   <ITEMS2>1</ITEMS2>  </ITEM>  <ITEM>   <ITEMS>二</ITEMS>   <ITEMS2>2</ITEMS2>  </ITEM> </ALL> というようなXMLに <xsl:for-each select="ALL/ITEM">  <xsl:value-of select="ITEMS" /><BR /> </xsl:for-each> という処理をかけると、一<BR>二<BR>のように表示されますが、常に一番最初のITEMS(この場合、一)が欲しいときはどうすればいいのでしょうか。 <xsl:value-of select="ITEMS[1]" />や <xsl:value-of select="ITEMS[position()=1]" /> 等を試してみましたが、現在の値が抽出されてしまい失敗しました。参考ページでもいいので教えてください。お願いします。

    • 締切済み
    • XML
  • xslでの最小値、最大値の取得

    <A>  <B>50</B>  <B>20</B>  <B>5</B>  <B>60</B>  <B>100</B> </A> 例えば上のようなXMLがあったとします。 それにxslを適用したときに、最小値と最大値のみを表示させたいのですが、xslではどのような処理をすればよいのでしょうか? <xsl:for-each select="A">  <xsl:sort select="./B"/>  <xsl:value-of select="."/> </xsl:for-each> 上のようだと全ての<B>が昇順に表示されるだけです。 何か最小値、最大値を取得する関数等ありますでしょうか?

    • ベストアンサー
    • XML
  • xslのdocument関数で読込んだ2つのxmlをxsl:sortしたい

    次のXSLで動作させています。 <?xml version="1.0" encoding="Shift_JIS"?> <xsl:stylesheet xml:space="default" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0" xmlns:rs="urn:schemas-microsoft-com:rowset" xmlns:z="#RowsetSchema"> <xsl:output method="text" /> <xsl:template match="/"> <xsl:for-each select="document('取り込むXMLファイル')//z:row"> <xsl:value-of select="@取り出したい属性の名前" /> </xsl:for-each> <xsl:for-each select="//z:row"> <xsl:value-of select="@取り出したい属性の名前" /> </xsl:for-each> </xsl:template> </xsl:stylesheet> ここまでは出来たのですが、xsl:sortでまとめてsortするにはどうすればいいのでしょうか?

    • ベストアンサー
    • XML
  • tableを3段組みにしてsortをかけたい

    下記のxsltによってtableを3段組にしています。 <?xml version="1.0" encoding="UTF-8"?> <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> <xsl:template match="/"> <html> <title>test</title> <body> <table border="1"> <xsl:apply-templates select="cate/tea/name[position() mod 3 = 1]"/> </table> </body> </html> </xsl:template> <xsl:template match="cate/tea/name"> <tr> <td><xsl:value-of select="."/></td> <td><xsl:value-of select="following-sibling::name[1]"/></td> <td><xsl:value-of select="following-sibling::name[2]"/></td> </tr> </xsl:template> </xsl:stylesheet> こんな感じの出力です。 <table> <tr> <td>あかぎ</td> <td>さとみ</td> <td>ゆめお</td> </tr> <tr> <td>かさお</td> <td>らの</td> <td>でお</td> </tr> 省略 </table> xmlは下記です。 <cate> <tea> <name>あかぎ</name> <name>さとみ</name> <name>ゆめお</name> <name>かさお</name> <name>らの</name> <name>でお</name> <name>くる</name> <name>もも</name> <name>しょう</name> <name>さめお</name> <name>たさお</name> <name>うらの</name> <name>こでお</name> <name>さくる</name> <name>れもも</name> <name>きょう</name> </tea> </cate> この3段組みをしたまま、 nameを名前順にソートしたいのですが、 うまくいきません。 あかぎ、かさお、くる、といった左の列内だけで、 ソートされてしまい、次にそれぞれの後続の兄弟ノードが、 真ん中の列にでてしまいます。 ちゃんと、xmlデータ順(あかぎ、さとみ、ゆめお、かさお・・・)に3段組みを表現したいのですが、 無理なのでしょうか。 どなたかご協力お願いします。

    • ベストアンサー
    • XML
  • formから値を取ってくる

    検索機能つきのページを作ろうとしています。 htmlでformを使い閲覧者から指示された任意文字をxmlへ持ってくるにはどうしたらよいでしょうか? 今のところ ---html--- <FORM method="POST" action="kk.xml"> 名前:<input type="text" name="serch"> <INPUT type="submit" value="検索"></FORM> ---------- ---xml---- <xsl:variable name="serch"></xsl:variable> <xsl:value-of select="$serch" /> ---------- と行っているのですが値がxmlまで来ていないようです。

    • 締切済み
    • XML
  • xslでの表示

    例えば <title>タイトルA</title> <P>no1</P> <P>no2</P> <P>no3</P> <P>no4</P> <title>タイトルB</title> <P>no5</P> <P>no6</P> <P>no7</P> <P>no8</P> というようなxmlがあったとします。 xslを適用して、 タイトルA no1 no2 no3 no4 タイトルB no5 no6 no7 no8 と表示するにはどのようにすればよいのでしょうか? <xsl:for-each select="//P">  <P><value-of select="."/></P> </xsl:for-each> ではnoのみが表示され、タイトルが表示されず、また、 <xsl:for-each select="//title">  <P><xsl:value-of select="."/></P>  <xsl:for-each select="../P">   <P><xsl:value-of select="."/></P>  </xsl> </xsl> では、 タイトルA no1 no2 no3 no4 no5 no6 no7 no8 タイトルB no1 no2 no3 no4 no5 no6 no7 no8 となってしまいます。

    • ベストアンサー
    • XML
  • XSL中の改行、タブを無効にしたい。

    XMLドキュメントにXSLを適用すると XSL中の改行やタブがそのまま反映されてしまいます。 改行を無くすと1行が長くなってしまい編集が大変で困っています。 どうしたらよいのでしょうか? XSL: <?xml version="1.0" encoding="Shift_JIS"?> <xsl:stylesheet xml:space="default" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0" xmlns:rs="urn:schemas-microsoft-com:rowset" xmlns:z="#RowsetSchema"> <xsl:output method="text" /> <xsl:template match="/"> <xsl:for-each select="//z:row"> <xsl:choose> <xsl:when test="(@MACHINE='DELL')"> </xsl:when> <xsl:when test="(@MACHINE='APPLE')"> </xsl:when> <xsl:when test="(@MACHINE='HP')"> </xsl:when> <xsl:otherwise> <xsl:value-of select="@MACHINE" />, <xsl:value-of select="substring(@PARTS_NO,1,1)" />-<xsl:value-of select="substring(@PARTS_NO,2,3)" />-<xsl:value-of select="substring(@PARTS_NO,5,3)" />-<xsl:value-of select="substring(@PARTS_NO,8,2)" />,<xsl:value-of select="@STATUS" />,<xsl:value-of select="@STOCK_NUM" /><xsl:text>&#xA;</xsl:text> <xsl:if test="not(@MACHINE=following-sibling::z:row/@MACHINE)"> <xsl:text>,&#xA;</xsl:text> </xsl:if> </xsl:otherwise> </xsl:choose> </xsl:for-each> </xsl:template> </xsl:stylesheet>

    • ベストアンサー
    • XML
  • スタイルシートのfor-each select=に変数を使用したい

    お世話になります。 <xsl:param name="A" select="1000"> ・ ・ ・ <xsl:template name="B"> ・ ・ ・ <xsl:for-each select=".//1000"> -(1) </xsl:template> <xsl:template match="1000"> -(2) </xsl:template> (1) (1)の箇所の「1000」を上で宣言したAを使用したく、 <xsl:for-each select="concat('.//',$A")>  など色々試したのですが、うまくいきませんでした。 (2) (2)の箇所を「A」の変数に色々な形で置き換えてもうまくいきませんでした。 上記2点、を変数を使用して指定したいのですが、どのようにすれば実現できますでしょうか? 大変お手数とは思いますがよろしくお願いします。

    • ベストアンサー
    • XML
  • for-eachが上手くいきません

    xslを使ってごくごく基本的なことをしようとしているのですが、何故か上手くいかず煮詰まっています。 ここが違う!というツッコミを是非よろしくお願いします。 ごく単純なことですが、xmlで複数の<site></site>内にあるデータそれぞれ表示させるためxslファイル内でfor-eachを使っています。for-each抜きだと一つ目の<site></site>がちゃんと表示されるのですが、for-eachを付け加えた途端何も表示されなくなってしまいます。 参考書を見て何度確認、やり直しをしても上手くいかず困っています。 使っているコードは以下の通りです。 XMLファイル: <?xml version="1.0" encoding="Shift-JIS" ?> <?xml-stylesheet type="text/xsl" href="links.xsl" ?> <links> <site> <name>サイト1</name> <banner>some.jpg</banner> </site> <site> <name>サイト2</name> <banner>other.jpg</banner> </site> </links> XSLファイル: <?xml version="1.0" encoding="Shift-JIS" ?> <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> <xsl:template match="/"> <html> <head><title><title></head> <body> <table border="1"> <xsl:for-each select="links/site"> <tr> <td> <img> <xsl:attribute name="src"> <xsl:value-of select="links/site/banner" /> </xsl:attribute> </img> <b><xsl:value-of select="links/site/name" /></b> </td> </tr> </xsl:for-each> </table> </body> </html> </xsl:template> </xsl:stylesheet> 何かアドバイスがありましたらお聞かせ下さい。

    • ベストアンサー
    • XML