2016-06-09 1 views
0

Я пытаюсь сортировать список магазинов сначала по провинциям, а затем по городу. Вот пример XML:xsl: сортировать файл 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> 

Н ote предполагаемый корневой элемент stores.

0

Используйте два элемента сортировки xsl: для первичного и вторичного ключей, соответственно.