在节点树中添加一个节点 - 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>
我实际上是在用 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>