Xslt 在遍历结束时对输出进行排序的xsl转换

Xslt 在遍历结束时对输出进行排序的xsl转换,xslt,Xslt,改变这种状况的最佳方式是什么 <root> <data/> <data/> </root> 为此: <data1/> <data1/> <data2/> <data2/> xslt引擎的工作方式让我认为它只能产生以下结果: <data1/> <data2/> <data1/> <data2/> 这是由这个简单的表生成的: <

改变这种状况的最佳方式是什么

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


是否可以在转换结束时进行某种形式的重新排序(无需使用第二个应用程序)?

如果您只想添加示例样式表中的元素,但顺序不同,您可以这样做

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

必须使用两个单独的模板来创建
data1
data2
元素。然后,您可以从与根节点匹配的模板应用这些模板,例如。
xsl:template
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>

好的,我知道了,谢谢。尽管我更喜欢nwellnhof给出的递归方法。