gpt4 book ai didi

xml - 使用 xslt 在特定点添加 xml 节点

转载 作者:数据小太阳 更新时间:2023-10-29 02:23:01 25 4
gpt4 key购买 nike

我有以下 xml 并想向其中插入其他 xml:

<root>
<steps>
<step name="step1" type="process">
<steps>
<step name="substep1">
</step>
</steps>
</step>
<step name="step2" type="process">
<steps>
<step name="substep1">
<!-- more substeps...-->
</step>
</steps>
</step>
<step name="step3" type="process">
<steps>
<step name="substep1">
</step>
<step name="substep2">
</step>
<!-- more substeps...-->
</steps>
</step>
<!-- THE BELOW IS WHAT I WISH TO ADD... and it has to be here -->
<step name="reference">
<!-- These stuff have been hardcoded in my xsl so its fine -->
</step>
<!-- ends -->
</steps>
<references>
<reference name="reference1">
</reference>
.
.
.
</references>
</root>

正如我在 xml 示例中所写的,我希望添加一个额外的 step 元素作为最外层步骤中的最后一步。我的 xsl 中已经硬编码了 xml 片段,所以我需要做的就是找到移动到 xml 树的特定点的最佳逻辑,这样我就可以调用模板并添加该片段。

执行此操作的推荐/最佳方法是什么?

谢谢。

最佳答案

这个转换:

<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
exclude-result-prefixes="xsl">
<xsl:output omit-xml-declaration="yes" indent="yes"/>
<xsl:strip-space elements="*"/>

<xsl:param name="pAddition">
<step name="reference">
<XXX/>
</step>
</xsl:param>

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

<xsl:template match="/*/steps/step[position()=last()]">
<xsl:call-template name="identity"/>
<xsl:copy-of select="$pAddition"/>
</xsl:template>
</xsl:stylesheet>

应用于此 XML 文档时:

<root>
<steps>
<step name="step1" type="process">
<steps>
<step name="substep1">
</step>
</steps>
</step>
<step name="step2" type="process">
<steps>
<step name="substep1">
<!-- more substeps...-->
</step>
</steps>
</step>
<step name="step3" type="process">
<steps>
<step name="substep1">
</step>
<step name="substep2">
</step>
<!-- more substeps...-->
</steps>
</step>
</steps>
<references>
<reference name="reference1">
</reference>
.
.
.
</references>
</root>

产生想要的、正确的结果:

<root>
<steps>
<step name="step1" type="process">
<steps>
<step name="substep1"/>
</steps>
</step>
<step name="step2" type="process">
<steps>
<step name="substep1"><!-- more substeps...--></step>
</steps>
</step>
<step name="step3" type="process">
<steps>
<step name="substep1"/>
<step name="substep2"/><!-- more substeps...-->
</steps>
</step>
<step name="reference">
<XXX/>
</step>
</steps>
<references>
<reference name="reference1"/>
.
.
.
</references>
</root>

请注意:

  1. **身份规则用于按原样复制所有节点。

  2. 要插入的 XML 片段被指定(为了方便)作为全局 xsl:param 的主体。在实际的应用程序中,它将位于单独的 xml 文件中,并将使用 xslt document() 函数获取。

  3. 匹配插入点的模板通过调用identity rule复制匹配的节点。然后它复制 xsl:param 的内容,因此新的内容会准确地输出到所需的插入点。

关于xml - 使用 xslt 在特定点添加 xml 节点,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3473324/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com