使用xslt1.0对节点数据按字母顺序排序

时间:2013-07-25 16:28:06

标签: xslt xslt-1.0 xslt-grouping

我想按字母顺序显示州名和国家/地区名称。     如果有任何county1节点与状态相关,我需要显示全部     在国家名称中的国家。但是如果没有以国家开头的州     某个字母表比如说“X”然后它不应该显示为空。     我很确定这对xslt是可行的,但不知道如何去做。     所以你在那里大师,pleeeeeeease帮助我。我正在使用visaul stuido2010 xml编辑器和xslt1.0 ..     我无法改变xslt版本..我在这里被击中..

My Input xml Looka like below : 
     <?xml version="1.0" encoding="utf-8" ?>
        <countries>
         <country>
            <state>Ontario</state>
            <country1>CANADA</country1>
          </country>
          <country>
            <state>Swindon</state>
          </country>
          <country>
            <state>CAMDEN</state>
          </country>
          <country>
            <state>NJ</state>
            <country1>America</country1>
          </country>
          <country>
           <state>NJ</state>
            <country1>America</country1>
           </country>
          <country>
            <state>NY</state>
            <country1>America</country1>
           </country>
          <country>
             <state>DE</state>
            <country1>America</country1>
          </country>
          <country>
            <state>Queenland</state>
            <country1>Australia</country1>
          </country>
          <country>
            <state>APstate</state>
          </country>
          <country>
            <state>ANstate</state>
          </country>
        </countries>

我的输出如下所示:

A
America
  - DE
  - NJ
  - NY
ANstate
APstate
Australia
  -Queenland
C
CAMDEN
CANADA
  -Ontario
S
Swindon

1 个答案:

答案 0 :(得分:0)

这为您提供了所要求的精确输出。

请注意,这是三级分组,在XSLT 1.0中最容易使用变量而不是使用Muenchian方法。在XSLT 2.0中它更容易。

t:\ftemp>type countries.xml 
<?xml version="1.0" encoding="utf-8" ?>
        <countries>
         <country>
            <state>Ontario</state>
            <country1>CANADA</country1>
          </country>
          <country>
            <state>Swindon</state>
          </country>
          <country>
            <state>CAMDEN</state>
          </country>
          <country>
            <state>NJ</state>
            <country1>America</country1>
          </country>
          <country>
           <state>NJ</state>
            <country1>America</country1>
           </country>
          <country>
            <state>NY</state>
            <country1>America</country1>
           </country>
          <country>
             <state>DE</state>
            <country1>America</country1>
          </country>
          <country>
            <state>Queenland</state>
            <country1>Australia</country1>
          </country>
          <country>
            <state>APstate</state>
          </country>
          <country>
            <state>ANstate</state>
          </country>
        </countries>
t:\ftemp>call xslt countries.xml countries.xsl 

A
America
  - DE
  - NJ
  - NY
ANstate
APstate
Australia
  - Queenland
C
CAMDEN
CANADA
  - Ontario
S
Swindon
t:\ftemp>type countries.xsl 
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
  version="1.0">

<xsl:output method="text"/>

<xsl:template match="countries">
  <!--set the population to be all top-level sorted constructs-->
  <xsl:variable name="countries"
                select="country/country1 | country[not(country1)]/state"/>
  <xsl:for-each select="$countries">
    <xsl:sort select="."/>
    <xsl:if test="generate-id(.)=
                  generate-id($countries[substring(.,1,1) = 
                                         substring(current(),1,1)][1])">
      <!--at first of the letter-->
      <xsl:variable name="letters"
                    select="$countries[substring(.,1,1) = 
                                       substring(current(),1,1)]"/>
      <xsl:text>&#xa;</xsl:text>
      <xsl:value-of select="substring(.,1,1)"/>
      <xsl:for-each select="$letters">
        <xsl:sort select="."/>
        <xsl:if test="generate-id(.)=
                      generate-id($letters[. = current()][1])">
          <!--at first of a country-->
          <xsl:text>&#xa;</xsl:text>
          <xsl:value-of select="."/>
          <xsl:variable name="states"
                        select="$letters[. = current()]
                                          [self::country1]/../state"/>
          <xsl:for-each select="$states">
            <xsl:sort select="."/>
            <xsl:if test="generate-id(.)=
                          generate-id($states[.=current()][1])">
              <!--each of the states for a country-->
              <xsl:text>&#xa;  - </xsl:text>
              <xsl:value-of select="."/>
            </xsl:if>
          </xsl:for-each>
        </xsl:if>
      </xsl:for-each>
    </xsl:if>
  </xsl:for-each>
</xsl:template>

</xsl:stylesheet>
t:\ftemp>rem Done!