こんにちはゲストさん。会員登録(無料)して質問・回答してみよう!

解決済みの質問

一つ前の値

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

投稿日時 - 2001-08-30 19:02:29

QNo.126962

暇なときに回答ください

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

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

投稿日時 - 2001-08-31 17:37:13

お礼

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

投稿日時 - 2001-09-03 14:25:41

ANo.1

このQ&Aは役に立ちましたか?

3人が「このQ&Aが役に立った」と投票しています

回答(1)