我有一個類似如下的XML文件...XSLT:分組和排序....怎麼樣?
<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
(城市不必爲字母順序,只是狀態)
我試圖這樣做來解決這個一換對每個國家/狀態,按名稱排序,並進行處理。像這樣的....
<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 ...任何想法/建議?
感謝
開始閱讀有關它....很快就迷路了。將再試一次。 – Doug 2010-09-23 20:24:32
是的,我不會說謊,你已經爲你剪掉了你的作品。我只實施了幾次,但我總是掙扎... – 2010-09-23 20:26:59