2012-04-13 47 views
0

我有一組具有不同屬性的元素,像這樣:的xsl:在XSL排序不均勻要素:對,每個

<?xml version="1.0" encoding=utf-8"?> 
<root> 
    <elem at="4" iterate="third" /> 
    <foo/> 
    <elem at="1" iterate="first" /> 
    <bar/> 
    <elem start="3" end="9" iterate="second" /> 
</root> 

我想遍歷elem標籤,所以我指定的for-each這樣:

<xsl:for-each select="/root/elem"> 

到目前爲止好,但現在我想排序這些元素,根據自己的@at@start領域,而每個elem保證有或者@at@start。我在@iterate屬性中註釋了我想如何迭代標記(僅爲了清晰起見)。

我的做法是這樣的

<xsl:sort select="@at or @start" data-type="number" order="ascending" /> 

但這似乎並不打算作爲與@at屬性的元素的工作似乎是優先於與@start屬性的元素。

那麼,我該如何告訴XSLT(1.0)不要區分設置的屬性名稱,而只是根據其各自的值進行排序?

回答

2

你並不遙遠。嘗試使用聯合運算符|

<xsl:sort select="@at|@start" data-type="number" order="ascending" /> 

以下是完整的XSLT

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
    <xsl:output method="xml" indent="yes"/> 

    <xsl:template match="root"> 
     <root> 
     <xsl:apply-templates select="elem"> 
      <xsl:sort select="@at|@start" data-type="number" order="ascending" /> 
     </xsl:apply-templates> 
     </root> 
    </xsl:template> 

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

當適用於您的XML,下面是輸出

<root> 
    <elem at="1" iterate="first"></elem> 
    <elem start="3" end="9" iterate="second"></elem> 
    <elem at="4" iterate="third"></elem> 
</root> 
+0

你是對的。我* *非常接近:)謝謝! – bitmask 2012-04-13 14:21:51