2013-10-10 117 views
0

的是將這一XSL轉換在穿越

<root> 
    <data/> 
    <data/> 
</root> 

到這個實際的最佳方式結束排序輸出:

<data1/> 
<data1/> 
<data2/> 
<data2/> 

莫名其妙的方式XSLT引擎的作品讓我覺得還可以只生產這個:

<data1/> 
<data2/> 
<data1/> 
<data2/> 

這是由這個簡單的表格生產:

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
<xsl:output method="xml" indent="yes"/> 
<xsl:template match="data"> 
    <xsl:element name="data1"/> 
    <xsl:element name="data2"/> 
</xsl:template> 
</xsl:stylesheet> 

是否有可能在轉換結束時進行某種重新排序(不使用第二個應用程序)?

回答

1

你必須使用兩個單獨的模板來創建data1data2元素。然後,例如,您可以從與根節點匹配的模板中應用這些模板。 的mode屬性在這種情況下也很有用:

<xsl:template match="/"> 
    <xsl:apply-templates select="//data" mode="data1"/> 
    <xsl:apply-templates select="//data" mode="data2"/> 
</xsl:template> 

<xsl:template match="data" mode="data1"> 
    <xsl:element name="data1"/> 
</xsl:template> 

<xsl:template match="data" mode="data2"> 
    <xsl:element name="data2"/> 
</xsl:template> 
1

如果你只想添加樣例樣式表中的元素,但順序不同,你可以這樣做。

<xsl:template match="/"> 
    <!-- adding data1 for every data tag--> 
    <xsl:for-each select="//data" > 
    <xsl:element name="data1"/> 
    </xsl:for-each> 
    <!-- adding data2 for every data tag--> 
    <xsl:for-each select="//data" > 
    <xsl:element name="data2"/> 
    </xsl:for-each> 
</xsl:template> 
+0

好的,我明白了,謝謝。雖然我更喜歡nwellnhof給出的遞歸方法。 – user1240076