当前位置: 首页 > 知识库问答 >
问题:

XSLT-复制所有节点并在复制的节点中添加额外节点

樊运乾
2023-03-14

我正在寻找下面输入和输出XML的XSLT(1.0)代码。

在输出XML中,C6元素下可以有任何子节点。在下面的XML中,我放了CN元素,但它可以是任何名称。

输入XML-

    <?xml version = "1.0" encoding = "UTF-8"?>
    <root>
        <input>
            <c2>
                <c3>
                    <c4>c4</c4>
                </c3>
            </c2>
        </input>
        <output>
            <c5>
                <c6>
                    <CN>
                        <T1></T1>
                        <T2></T2>
                    </CN>
                </c6>
                <c6>
                    <CN>
                        <T1></T1>
                        <T2></T2>
                    </CN>
                </c6>
            </c5>
        </output>
    </root>

所需的输出XML-

    <root>
    <output>
            <c5>
                <c6>
                <!-- It could have any child node. Putting an example with CN child node name.-->
                    <CN>
                        <T1></T1>
                        <T2></T2>
                        <c3>
                            <c4>c4</c4>
                            <NewNode>current number of CN node which will be 1</NewNode>
                            <NewNode1>total number of C6 nodes which will be 2.</NewNode1>
                        </c3>
                    </CN>
                </c6>
                <c6>
                    <CN>
                        <T1></T1>
                        <T2></T2>
                        <c3>
                            <c4>c4</c4>
                            <NewNode>current number of CN node which will be 2</NewNode>
                            <NewNode1>total number of C6 nodes which will be 2.</NewNode1>
                        </c3>
                    </CN>
                </c6>
            </c5>
        </output>
    </root>

先谢谢你。

共有1个答案

巫墨一
2023-03-14

使用以下样式表:

<?xml version="1.0" encoding="UTF-8" ?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
  <xsl:output method="xml" encoding="UTF-8" indent="yes" />

  <xsl:template match="c6/*">
    <xsl:copy>
        <xsl:variable name="v1" select="count(../preceding-sibling::*)+1"/>
        <xsl:variable name="v2" select="count(../../*)"/>
        <xsl:apply-templates/>
        <xsl:apply-templates select="../../../../input/c2/c3">
          <xsl:with-param name="v1" select="$v1"/>
          <xsl:with-param name="v2" select="$v2"/>
        </xsl:apply-templates>
    </xsl:copy>
  </xsl:template>

  <xsl:template match="c3">
    <xsl:param name="v1"/>
    <xsl:param name="v2"/>
    <xsl:copy>
      <xsl:apply-templates/>
      <NewNode><xsl:value-of select="$v1"/></NewNode>
      <NewNode1><xsl:value-of select="$v2"/></NewNode1>
    </xsl:copy>
  </xsl:template>

  <xsl:template match="input"/>

  <xsl:template match="@*|node()">
    <xsl:copy><xsl:apply-templates select="@*|node()"/></xsl:copy>
  </xsl:template>
</xsl:stylesheet>
 类似资料:
  • 我已经创建了一个XSLT,我想知道如何在一组标记之间复制所有节点,并在底部添加另一个标记。我创建了XSLT,它具有确定要添加哪个标记以及应该调用什么的所有逻辑。然而,我现在遇到的问题是,我不能复制所有其他标签了。以下是有关文件: XSLT 输入 电流输出 期望的产出

  • 我需要将子元素复制到父元素中。 输入 期望输出 我尝试的内容(输出与输入保持相同): 我肯定会错过一些非常简单的事情。子元素与父元素具有相同的名称,这应该不是问题?

  • 我想从父节点复制到子节点。我真的不确定这是如何实现的。 我的源xml 我想得到输出为 我想要XSLT1.0中的解决方案。 我想将这些节点复制到子节点 谢谢。

  • 我需要以下xslt代码方面的帮助。我的意见如下: 我的预期输出为: 我曾尝试使用*/text()获取值节点的值,但我只从第一个孩子获得文本。将来我有很多这样的子元素。 提前谢谢。 你好,Minakshi

  • 我认为主要的问题是如何编写exeption表达式来去除输出结果中的“S-3”和“Z”属性。但是怎么做呢? 源代码 期望输出 我的xslt代码(S-3和Z属性仍然存在,但不应该)https://xsltfiddle.liberty-development.net/3NSTbfj/1 我会感激任何解决办法

  • 节点复制是另一种追踪式收集,在回收阶段和标记-清除采用了不同的策略,简单地说,标记-清除主动释放垃圾,而节点复制是将可达集拷贝出来,然后统一回收整块内存 前面说过,据统计80%~98%的对象在建立之后很快就会销毁,由此可以预见,在正常情况下,当启动垃圾回收的时候,可达集和垃圾集合是不成比例的,堆空间中很可能只有少部分的内容可达,剩下都是垃圾,标记-清除算法的时间和对象数量相关,而节点复制由于只拷贝