2010-02-18 57 views
4

如何以特定順序編寫元素屬性而無需明確寫入?按特定順序排列屬性以便輸出

考慮:

<xsl:template match="Element/@1|@2|@3|@4"> 
    <xsl:if test="string(.)"> 
     <span> 
      <xsl:value-of select="."/><br/> 
     </span> 
    </xsl:if> 
</xsl:template> 

的屬性應該出現的順序1, 2, 3, 4。不幸的是,你不能保證在XML屬性的順序,也可能是<Element 2="2" 4="4" 3="3" 1="1">

所以上面的模板將產生如下:

<span>2</span> 
<span>4</span> 
<span>3</span> 
<span>1</span> 

理想的情況下,我不想要測試,如果它的每個屬性已經有了價值。我想知道如果我能以某種方式設置我的顯示順序?或者我需要明確地做,並重復如果測試如下:

<xsl:template match="Element"> 

    <xsl:if test="string(./@1)> 
     <span> 
      <xsl:value-of select="./@1"/><br/> 
     </span> 
    </xsl:if> 
    ... 
    <xsl:if test="string(./@4)> 
     <span> 
      <xsl:value-of select="./@4"/><br/> 
     </span> 
    </xsl:if> 
</xsl:template> 

在這種情況下可以做什麼?

+0

謝謝各位的回覆。 我不是很清楚。我並不需要通過名稱對屬性進行排序,而是自己指定一個訂單。 說一個文檔將需要按順序1,2,3,4顯示它們。另一個按順序2,3。另一個可以說是3,1,2,4。 我想知道是否可以存儲以某種方式確定屬性名稱的特定順序......然後通過它們迭代。 基本上,爲了顯示一系列屬性值,有一些簡潔和非常靈活的方法。 希望有道理? – DashaLuna 2010-02-18 16:55:01

回答

6

在之前的問題中,您似乎使用了XSLT 2.0,所以我希望這次也可以使用XSLT 2.0解決方案。

訂單不是在模板的匹配模式中確定的,而是在您執行xsl:apply-templates時確定的。所以(使用XSLT 2.0),你可以簡單地按你想要的順序編寫一系列屬性,例如<xsl:apply-templates select="@att2, @att1, @att3"/>將按照該順序處理屬性。

XSLT 1.0沒有序列,只有節點集。要產生相同的結果,請按要求順序使用xsl:apply-templates,例如:

<xsl:apply-templates select="@att2"/> 
<xsl:apply-templates select="@att1"/> 
<xsl:apply-templates select="@att3"/> 
1

我會使用屬性的本地名稱上的xsl:sort來獲得您想要的結果。我也會使用不同的模式,所以結果不會在別的地方偶然被調用。

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

    <xsl:template match="Element"> 
     <xsl:apply-templates select="@*" mode="sorted"> 
     <xsl:sort select="local-name()" /> 
    </xsl:apply-templates> 
    </xsl:template> 

    <xsl:template match="Element/@a|@b|@c|@d" mode="sorted"> 
    <xsl:if test="string(.)"> 
     <span> 
      <xsl:value-of select="."/><br/> 
     </span> 
    </xsl:if> 
    </xsl:template> 
</xsl:stylesheet> 
3

請勿生成依賴於屬性順序的XML。這是非常脆弱的,至少可以說我會認爲這是一種糟糕的風格。 XML不是那樣設計的; <elem a="1" b="2" /><elem a="1" b="2" />明確等同。

如果您想要訂購輸出,請訂購您的輸出(而不是依賴有序輸入)。

此外,match="Element/@1|@2|@3|@4"不等於match="Element/@1|Element/@2|Element/@3|Element/@4",但我相信你是指後者。

話雖這麼說,你可以這樣做:

<xsl:template match="Element/@1|Element/@2|Element/@3|Element/@4"> 
    <xsl:if test="string(.)"> 
    <span> 
     <xsl:value-of select="."/><br/> 
    </span> 
    </xsl:if> 
</xsl:template> 

<xsl:template match="Element"> 
    <xsl:apply-templates select="@1|@2|@3|@4"> 
    <!-- order your output... --> 
    <xsl:sort select="name()" /> 
    </xsl:apply-templates> 
</xsl:template> 

編輯:我會把它作爲讀取@1等只是例子,因爲名稱實際上不能用XML數字開頭。