1

動的なルート要素 (静的な名前ではない) と、そのルート要素の下にいくつかの子を持つ xml ツリーがあります。ここで、xslt スクリプトを使用して、子要素の 2 番目の位置に要素を追加したいと考えています。どうすればいいですか?

例: xml:

<root>
  <element1>
    <element1a>
      ..
    </element1a>
  </element1>
  <element2 name="exampleName">This is text.</element2>
</root>

に変換する必要があります

<root>
  <element1>
    <element1a>
      ..
    </element1a>
  </element1>
  <someNewElement>1234</someNewElement>
  <element2 name="exampleName">This is text.</element2>
</root>

これまでに得たものは次のとおりです。しかし、そのソリューションでは、ノードは最初の位置にのみ追加されます。2番目の位置で必要です。

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

<xsl:template match="/">
    <xsl:apply-templates select="/*"/>
</xsl:template>

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

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

</xsl:stylesheet>
4

2 に答える 2

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

  <xsl:template match="/*/*[1]">
    <xsl:next-match />
    <xsl:element name="newElement">4711</xsl:element>
  </xsl:template>   

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

</xsl:stylesheet>

これは、ドキュメント要素の最初の要素の子に一致するテンプレートを定義し、( を使用してnext-match) 通常の ID テンプレート処理を行い、その後に新しい要素を挿入します。あなたは代わりに行うことができます

<xsl:template match="/*/*[2]">
  <xsl:element name="newElement">4711</xsl:element>
  <xsl:next-match />
</xsl:template>

2 番目の子に一致させ、その前に要素を挿入します。<root>子要素が 1 つしかない場合、2 つの違いは明らかです。この場合、/*/*[1]バージョンは を挿入しますnewElementが、は挿入し/*/*[2]ません。

于 2013-02-13T12:05:02.773 に答える