0

これを変換する実際の最良の方法は何ですか

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

変換の最後に (2 番目のアプリケーションを使用せずに) 並べ替えを行うことはできますか?

4

2 に答える 2

1

data1およびdata2要素を作成するには、2 つの別個のテンプレートを使用する必要があります。次に、たとえば、ルート ノードに一致するテンプレートからこれらのテンプレートを適用できます。のmode属性はxsl:template、この場合にも役立ちます。

<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>
于 2013-10-10T20:49:25.983 に答える
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>
于 2013-10-10T20:46:32.400 に答える