2016-06-09 88 views
0

我试图按省份排序,然后按城镇排序。下面是一个示例XML:xsl:使用2个不同的节点对XML文件进行排序

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

我是能够成功地将数据通过镇使用此代码进行排序:

<xsl:key name="towns" match="store" use="town"/> 
<xsl:for-each select="//store[generate-id(.)=generate-id(key('towns', town)[1])]"> 
<xsl:sort select="town"/> 
    <xsl:for-each select="key('towns', town)"> 
     <xsl:sort select="name"/> 
     <xsl:if test="position() = 1"> 
      <h2> 
       <xsl:value-of select="town"/> 
      </h2> 
     </xsl:if> 
    <b> <xsl:value-of select="name"/></b> <br/> 

    <br/> <br/>  
    </xsl:for-each> 
    </xsl:for-each> 

我将如何使用一键在前排序省,列出所有门店中新不伦瑞克省(按字母顺序排列,然后按名称排序)然后是安大略省?还是有没有更好的方法来做到这一点,而不使用密钥?谢谢!

+0

你说你是*排序*,但你也是*分组*。目前还不清楚你是否也想按省份进行分组,或只是按照省份进行分组。你可以在没有密钥的情况下进行排序,但是你需要它来进行分组。 –

+0

是的,我想组和排序。因此,首先按省份排序,然后按城镇名称(在这些省份组内)进行分组和排序,然后按商店名称进行排序(在城镇组内) –

回答

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根元素。

0

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