次のような XML ファイルがあります...
<states>
<state>
<name>North Carolina</name>
<city>Charlotte</city>
</state>
<state>
<name>Alaska</name>
<city>Fairbanks</city>
</state>
<state>
<name>Virginia</name>
<city>Leesburg</city>
</state>
<state>
<name>Alaska</name>
<city>Coldfoot</city>
</state>
<state>
<name>North Carolina</name>
<city>Harrisburg</city>
</state>
<state>
<name>Virginia</name>
<city>Ashburn</city>
</state>
</states>
各州をリストしたレポートを作成する必要があり、アルファベット順で各都市が続きます....など..
Alaska - Fairbanks, Coldfoot
North Carolina - Charlotte, Harrisburg
Virginia - Leesburg, Ashburn
(都市はアルファベット順である必要はなく、州だけです)
状態/状態で for-each を実行し、名前で並べ替えて処理することで、これを解決しようとしました。このような....
<xsl:for-each select="states/state">
<xsl:sort select="name" data-type="text" order="ascending"/>
<xsl:value-of select="name"/>-<xsl:value-of select="city"/>
</xsl:for-each>
これは私に与えた....
Alaska - Fairbanks
Alaska - Coldfoot
North Carolina - Charlotte
North Carolina - Harrisburg
Virginia - Leesburg
Virginia - Ashburn
並べ替えが機能したので、グループ化したいと思います。私が考えることができた唯一のことは、以前の状態と比較することでした.ソートされているので、状態値が変更されていないかどうかを認識する必要があります. このような...
<xsl:for-each select="states/state">
<xsl:sort select="name" data-type="text" order="ascending"/>
<xsl:variable name="name"><xsl:value-of select="name">
<xsl:variable name="previous-name"><xsl:value-of select="(preceding-sibling::state)/name">
<xsl:if test="$name != $previous-name">
<br/><xsl:value-of select="name"/>-
</xsl:if>
<xsl:value-of select="city"/>
</xsl:for-each>
悲しいことに、前の兄弟機能はこの種ではうまく機能しないようです。そのため、初めて (最初のアラスカで) 最初のノースカロライナが前の兄弟として表示されました。これは、私の好みではなかったいくつかの奇妙な結果を引き起こします。
それで、私は XSLT1.0 を使用しています...何か考え/提案はありますか?
ありがとう