XML XSLT排序和多选

时间:2012-09-11 11:42:05

标签: xml xslt

我想首先选择多个节点并按日期排序。但是代码不能正常工作

XSLT

    <?xml version="1.0" encoding="UTF-8"?>
    <xsl:stylesheet version="1.0"
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform">

    <xsl:template match="/"> 
      <html>
      <body>
        <h2>display 9 Items</h2>
              <xsl:for-each select="groups/elements/category/types[@name='POP']/language | groups/elements[delivery]/category/types[@name='POP']/language">
            <xsl:sort select="ancsetor::elements[1]/PostDate" order="descending"/>
            <xsl:if test="not(position() > 9)">
            <b><xsl:value-of select="PostDate" /></b> - 
            <font color='red'><xsl:value-of select="name" /></font>
           <p></p>
           </xsl:if>
          </xsl:for-each>
      </body>
      </html>
    </xsl:template>

</xsl:stylesheet> 

XML文件

<?xml version="1.0" encoding="ISO-8859-1"?>
<?xml-stylesheet type="text/xsl" href="xslt.xslt"?>

<groups>
<elements>
<name>//1</name>
<BOD></BOD>
<description/>
<delivery/>
<URL></URL>
<Hobbbies>
<Sport></Sport>
<Music>
<category> 
<types Code="POP/DANCE" Name="POP"  />
<types Code="POP/MUSIC" Name="POP"  >
<language>Italian</language>
</types>
</category>
</Music>
</Hobbbies>
<Size></Size>
<PostDate>2012-03-04</PostDate>
<trackno></trackno>
</elements>
<elements>

<name>//1+1</name>
<BOD></BOD>
<description/>
<delivery/>yes
<URL></URL>
<Hobbbies>
<Sport></Sport>
<Music>
<category> 
<types Code="POP/DANCE" Name="POP"  />
<types Code="POP/MUSIC" Name="POP"  >
<language>Italian</language>
</types>
</category>
</Music>
</Hobbbies>
<Size></Size>
<PostDate>2012-03-04</PostDate>
<trackno></trackno>
</elements>



<elements>
<name>//2</name>
<BOD></BOD>
<description/>
<delivery/>
<URL></URL>
<Hobbbies>
<Sport></Sport>
<Music>
<category> 
<types Code="POP/DANCE" Name="PureMusic"  />
<types Code="POP/MUSIC" Name="JAZZ"  >
<language>No language</language>
</types>
</category>
</Music>
</Hobbbies>
<Size></Size>
<PostDate>2011-03-04</PostDate>
<trackno></trackno>
</elements>


<elements>
<name>//3</name>
<BOD></BOD>
<description/>
<delivery/>
<URL></URL>
<Hobbbies>
<Sport></Sport>
<Music>
<category> 
<types Code="JAZZ/DANCE" Name="JAZZ"  />
<types Code="JAZZ/MUSIC" Name="BLUES">
<language>English</language>
</types>
</category>
</Music>
</Hobbbies>
<Size></Size>
<PostDate>2012-05-04</PostDate>
<trackno></trackno>
</elements>


<elements>
<name>//4</name>
<BOD></BOD>
<description/>
<delivery/>yes
<URL></URL>
<Hobbbies>
<Sport></Sport>
<Music>
<category> 
<types Code="Blues/DANCE" Name="POP"  />
<types Code="Blues/MUSIC" Name="POP" >
 <language>No language</language>
</types>
</category>
</Music>
</Hobbbies>
<Size></Size>
<PostDate>2012-01-14</PostDate>
<trackno></trackno>
</elements>

</groups>

1 个答案:

答案 0 :(得分:1)

提供的代码中存在许多错误,最明显的是:

          <xsl:for-each select=
          "groups/elements/category/types[@name='POP']/language 
         | groups/elements[delivery]/category/types[@name='POP']/language"> 

types元素具有Name属性 - 而不是name属性。 XPath区分大小写,不同大写的名称被视为不同。

第二个逻辑错误

上面的联合等同于它的第一个参数:

groups/elements/category/types[@name='POP']/language 

因为第二个参数(nodeset)包含在第一个参数(node-set)中。

也许你想在第二个参数中指定不同的

第三个明显错误language元素没有名为PostDatename的子元素 - 因此{{1}中的代码不产生任何东西。

第四个错误xsl:for-each不是category的孩子 - 因此elements的{​​{1}}属性未选择甚至是一个节点。

<强>解决方案

如果纠正了上述所有错误,我的就是你想要的东西:

select

在提供的XML文档上应用此转换时

xsl:for-each

结果是

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

 <xsl:template match="/">
   <html>
      <body>
        <h2>display 9 Items</h2>
        <xsl:for-each select="groups/elements[.//category/types[@Name='POP']/language]">
            <xsl:sort select="PostDate" order="descending"/>
            <xsl:if test="not(position() > 9)">
            <b><xsl:value-of select="PostDate" /></b> -
            <font color='red'><xsl:value-of select="name" /></font>
           <p></p>
           </xsl:if>
        </xsl:for-each>
      </body>
   </html>
 </xsl:template>
</xsl:stylesheet>

,并在浏览器中显示为

          

显示9个项目

2012-05-02 -       // 13

2012-03-04 -       // 1

2012-03-04 -       // 1 + 1

2012-01-14 -       // 4

2010-03-04 -       // 5

2009-10-04 -       // 6

2007-02-18 -       // 9

2006-01-04 -       // 12

2004-03-04 -       // 8