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

一つ前の値

  • 質問No.126962
  • 閲覧数432
  • ありがとう数4
  • 回答数1

お礼率 29% (20/68)

<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:
と、なってしまいます。
良い方法はありませんでしょうか教えて下さい。

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

  • 回答No.1
  • ベストアンサー

ベストアンサー率 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>
お礼コメント
ryogoku

お礼率 29% (20/68)

すみません!XML間違っていました。
fatbackさんが書いておられる通りでした。
すみません。
おかげ様でできました。
ありがとうございました!!
投稿日時:2001/09/03 14:25
関連するQ&A

その他の関連するQ&Aをキーワードで探す

ページ先頭へ