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

bst*_*rre 1 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>
Run Code Online (Sandbox Code Playgroud)

我想输出按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>
Run Code Online (Sandbox Code Playgroud)

Jim*_*son 5

你要

    <xsl:sort select="Thing/@ID" data-type="number"/>
Run Code Online (Sandbox Code Playgroud)

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

  • +1正确答案.为了进一步解释,@ bst,`Thing/@ ID`和`Thing [@ID]`之间的区别在于前者意味着'Thing`元素'的'ID`属性,而后者意味着'a`具有"ID"属性的Thing元素(为了简化而对一些小细节进行着色). (4认同)