• ベストアンサー
  • 暇なときにでも

一つ前の値

<ALL>  <EX attr='3'><NAME>B</NAME></EX>  <EX attr='2'><NAME>B</NAME></EX>  <EX attr='1'><NAME>A</NAME></EX> </ALL> というXMLをつくり <xsl:for-each select="ALL/EX">  <xsl:sort select="./NAME"/>  <xsl:sort select="./@attr"/>  NAME:<xsl:value-of select="NAME"/>  attr:<xsl:value-of select="@attr"/><BR/> </xsl:for-each> というXSLにかけると  NAME:A attr:3  NAME:B attr:1  NAME:B attr:2 という結果が得られました。これを  NAME:A attr:3  NAME:B attr:1        attr:2 のように、現在のNAMEが前のNAMEと同じ場合は表示しない ようにしたいのですが上手くいきません。 参考書には現在のNAMEとpreceding-sibling::EX/NAME の値を比較すると良いと書いてあったので preceding-sibling::EX/NAMEの値を取ってみたのですが  NAME:A attr:3 preceding:B  NAME:B attr:1 preceding:B  NAME:B attr:2 preceding: と、なってしまいます。 良い方法はありませんでしょうか教えて下さい。

共感・応援の気持ちを伝えよう!

  • 回答数1
  • 閲覧数435
  • ありがとう数4

質問者が選んだベストアンサー

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

>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>

共感・感謝の気持ちを伝えよう!

質問者からのお礼

すみません!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
  • 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
  • お願いします。

    教えてください。 <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の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
  • 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
  • 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
  • <xsl:key>とtopreceding-siblingを使ったグループ化

    下記のxmlを <xml xmlns:s="uuid:#dummy#" xmlns:dt="#dummy#" xmlns:rs="#dummy#" xmlns:z="#RowsetSchema"> <s:Schema id="RowsetSchema"> <s:ElementType name="row" content="eltOnly" rs:CommandTimeout="30"> <s:AttributeType name="COUNTRY" rs:number="1" rs:nullable="true" rs:writeunknown="true"> <s:datatype dt:type="string" rs:dbtype="str" dt:maxLength="4" rs:fixedlength="true"/> </s:AttributeType> <s:AttributeType name="NAME" rs:number="2" rs:writeunknown="true"> <s:datatype dt:type="string" rs:dbtype="str" dt:maxLength="9" rs:fixedlength="true" rs:maybenull="false"/> </s:AttributeType> </s:ElementType> </s:Schema> <rs:data> <z:row COUNTRY="JAPAN" NAME="TARO" AGE="12"/> <z:row COUNTRY="JAPAN" NAME="JIRO" AGE="23"/> <z:row COUNTRY="CHINA" NAME="SABURO" AGE="34"/> </rs:data> </xml> 下記のxslを使用してCOUNTRY毎にグルーピングして csv形式で出力したいですが以下のxslだとうまくいきません。 <?xml version="1.0" encoding="Shift_JIS"?> <xsl:stylesheet xmlns:xsl="http://www.w3.org/TR/WD-xsl"> <xsl:key name="COUNTRY" match="//z:row" use="@COUNTRY" /> <xsl:template match="/"> <xsl:for-each select="//z:row[not(@COUNTRY = preceding-sibling:://z:row/@COUNTRY)]"> <xsl:value-of select="@COUNTRY" />,<xsl:value-of select="@NAME" />,<xsl:value-of select="@AGE" /> </xsl:for-each> </xsl:template> </xsl:stylesheet> [欲しい結果] JAPAN,TARO JAPAN,JIRO スペース CHINA,SABURO

    • ベストアンサー
    • 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
  • XSLの中でHTMLタグが使えない

    XMLとXSLTを使って、Formの中のListのオプションを、XML から取ってきたいと思ってます。イメージ的には、下記 の○○○の中に、<xsl:value-of select="."/>を入れる ことによって、<option value="<xsl:value-of select="."/>"><xsl:value-of select="."/></option> の様にしたいのですが、<や>を&lt;や&gt;に変えても、 うまく表示されません。また、Selectタグの属性の Multipleも=サインが無いとかで使えませし,Inputタグ も、終了タグが無いため使えませんでした。どのように 対処したら良いのでしょうか?よろしくお願いしま す。 <select name="list1" size="10" id="select5"> <xsl:apply-templates/> </select> <xsl:template match="//name"> <option value="○○○">○○○</option> </xsl:template>

    • 締切済み
    • XML