我有一个如下所示的 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... 有什么想法/建议吗?
谢谢