2011-05-25 33 views
1

考慮下面的XML:爲什麼這個xsl:sort selector沒有工作?

<?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> 

回答

5

你想

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

在哪裏發生這種情況來看,上下文已經在每個一級Thing,所以排序鍵是第二層次的東西的@ID屬性。

+0

感謝您的解釋。 – bstpierre 2011-05-25 20:48:19

+4

+1正確答案。爲了進一步解釋,@bst,「Thing/@ ID」和「Thing [@ID]」之間的區別在於前者意味着「Thing」元素的「ID」屬性,而後者意味着「一個」具有'ID'屬性'的東西'元素(爲了簡化而對一些小細節進行了修飾)。 – LarsH 2011-05-25 20:51:04

相關問題