xsl:使用2个不同的节点对XML文件进行排序

时间:2016-06-09 16:48:53

标签: xml sorting xslt-1.0

我正在尝试按省份然后按城镇排序商店列表。这是一个示例xml:

contentUri2

我能够使用以下代码按城镇成功对数据进行排序:

 <store>
  <name>Duncan's</name>
  <town>Waterloo</town>
  <province>Ontario</province>
 </store>
 <store>
  <name>Anne's</name>
  <town>Waterloo</town>
  <province>Ontario</province>
 </store>
 <store>
  <name>Apple Variety</name>
  <town>Woodstock</town>
  <province>Ontario</province>
 </store>
 <store>
  <name>Goose Market</name>
  <town>Sackville</town>
  <province>New Brunswick</province>
 </store>
 <store>
  <name>Family Market</name>
  <town>Sackville</town>
  <province>New Brunswick</province>
 </store>

我如何使用按键首先按省份排序,列出新不伦瑞克省的所有商店(按字母顺序首先按城镇,然后按名称),然后安大略省?或者,如果不使用密钥,有更好的方法吗?谢谢!

2 个答案:

答案 0 :(得分:0)

分别为主键和辅助键使用两个xsl:sort元素。

答案 1 :(得分:0)

  

第一组按省份排序,然后按城镇名称分组   (在那些省份组内)然后最终按商店名称排序(在   那些镇组)

以这种方式尝试:

XSLT 1.0

<xsl:stylesheet version="1.0" 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/>
<xsl:strip-space elements="*"/>

<xsl:key name="province" match="store" use="province"/>
<xsl:key name="town" match="store" use="concat(province, '|', town)"/>

<xsl:template match="/stores">
    <xsl:for-each select="store[generate-id()=generate-id(key('province', province)[1])]">
        <xsl:sort select="province"/> 
        <h2>
            <xsl:value-of select="province"/>
        </h2>

        <xsl:for-each select="key('province', province)[generate-id()=generate-id(key('town', concat(province, '|', town))[1])]">
            <xsl:sort select="town"/>
            <h3>
                <xsl:value-of select="town"/>
            </h3>
            <xsl:for-each select="key('town', concat(province, '|', town))">
                <xsl:sort select="name"/>
                <xsl:value-of select="name"/>
                <br/>
            </xsl:for-each> 
        </xsl:for-each> 
    </xsl:for-each> 
</xsl:template>

</xsl:stylesheet>

请注意假定的stores根元素。