2013-07-25 71 views
0

我想按字母順序顯示狀態和國家名稱。 如果有任何與縣名相關的縣節點,我需要在州名中顯示所有 州。但是,如果沒有以 開頭的州的某個字母表,例如說「X」,那麼它不應顯示爲空。 我很確定這是可能的與xslt,但不知道如何去做這件事。 所以你大師在那裏,pleeeeeeease幫助我,我現在用的VISAUL stuido2010 XML編輯器和xslt1.0 .. 我沒有辦法改變XSLT version..I來到這裏打..使用xslt1.0排序節點數據字母順序

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

的[在XML字母順序排序的數據(http://stackoverflow.com/questions/17845199/sort-data-in-the-xml-alphabetical-order) –

回答

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! 
+0

感謝您的回覆可能重複它運作完美。 – Blossom