为什么这个xsl:sort选择器不起作用?

时间:2011-05-25 20:08:13

标签: xml xslt

给出以下XML:

<?xml version="1.0"?>
<Things>
  <Thing>
    <Thing ID="0002"/>
    <Name>Bob</Name>
  </Thing>
  <Thing>
    <Thing ID="0003"/>
    <Name>Alice</Name>
  </Thing>
  <Thing>
    <Thing ID="0001"/>
    <Name>Carol</Name>
  </Thing>
</Things>

我想输出按ID属性排序的相同XML。以下样式表做我想要的。已注释掉的xsl:sort(以及我尝试的几种变体)不起作用 - 我只是获得原始文档的未分类副本。 (并且没有错误消息。)

如何在Thing元素上专门选择ID属性(以避免在较大文档中可能存在的其他元素上使用ID属性)?

<xsl:stylesheet
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
    version="1.0">

 <xsl:template match="node()|@*">
   <xsl:copy>
     <xsl:apply-templates select="node()|@*" />
   </xsl:copy>
 </xsl:template>

 <xsl:template match="Things">
   <xsl:copy>
     <xsl:apply-templates>
       <xsl:sort select="*/@ID" data-type="number"/>

       <!-- I don't understand why this doesn't work:

         <xsl:sort select="Thing/Thing[@ID]" data-type="number"/>
       -->
     </xsl:apply-templates>
   </xsl:copy>
 </xsl:template>

</xsl:stylesheet>

1 个答案:

答案 0 :(得分:5)

你想要

    <xsl:sort select="Thing/@ID" data-type="number"/>

在发生这种情况时,上下文已经出现在每个第一级Thing,因此排序键是第二级Thing的@ID属性。