在节点树中添加一个节点 - XSL

Add a node inside a node tree - XSL

我实际上是在用 XSL 执行转换,我需要创建一个模板来设法在节点树中添加一个节点,并且 return 所有这个节点树都带有新节点。

在我的例子中,我想在 </node2> 之后添加节点 <node3>HIJ</node3>,它在某些时候工作,但我失去了上部节点。

节点树:

<xsl:variable name="A">
  <node>
    <node1>ABC</node1>
    <node2>DEF</node2>
    <node4>KLM</node4>
  </node>
</xsl:variable>

模板的调用

<xsl:apply-templates select="$A" mode="copy">
  <xsl:with-param name="ValueOfTheNode" select="'HIJ"/>
</xsl:apply-templates>

我的模板实际上不起作用

<xsl:template match="node()/*" mode="copy">
    <xsl:param name="ValueOfTheNode"/>
    <xsl:copy-of select="."/>
    <xsl:if test="./name() = 'node2'">
        <node3>
            <xsl:value-of select="$ValueOfTheNode"/>
        </node3>
    </xsl:if>
</xsl:template>

当前结果:

<node1>ABC</node1>
<node2>DEF</node2>
<node3>HIJ</node3>
<node4>KLM</node4>

预期结果

<node>
    <node1>ABC</node1>
    <node2>DEF</node2>
    <node3>HIJ</node3>
    <node4>KLM</node4>
</node>

我不知道如何对代码说保留上节点,或者我从一开始就处理它的方式是错误的。我正在使用 xsl 2.0.

谢谢

我会简单地写一个匹配 node2:

的模板
<xsl:template match="node2" mode="copy">
    <xsl:param name="value" tunnel="yes"/>
    <xsl:next-match/>
    <node3>
        <xsl:value-of select="$value"/>
    </node3>
</xsl:template>

然后使用

    <xsl:apply-templates select="$A" mode="copy">
      <xsl:with-param name="value" select="'HIJ'" tunnel="yes"/>
    </xsl:apply-templates>

并让模式的默认模板设置身份转换,例如<xsl:mode name="copy" on-no-match="shallow-copy"/> 在 XSLT 3 中或在 XSLT 2 中拼写为

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

https://xsltfiddle.liberty-development.net/gWEaSuS