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

XSLT-复制所有其他节点,添加1个新节点

吴谦
2023-03-14

我已经创建了一个XSLT,我想知道如何在一组标记之间复制所有节点,并在底部添加另一个标记。我创建了XSLT,它具有确定要添加哪个标记以及应该调用什么的所有逻辑。然而,我现在遇到的问题是,我不能复制所有其他标签了。以下是有关文件:

XSLT

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

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

    <xsl:template match="/csvImportSchema">
        <csvImportSchema>
            <xsl:for-each select="payload">
                <payload>
                    <xsl:copy-of select="@*"/>
                    <xsl:variable name="ean">
                        <xsl:value-of select="ean"/>
                    </xsl:variable>
                    <xsl:for-each select="../product">
                        <xsl:if test="ean = $ean">
                            <productId><xsl:value-of select="article"/></productId>
                        </xsl:if>
                    </xsl:for-each>
                </payload>
            </xsl:for-each>
        </csvImportSchema>
    </xsl:template>

</xsl:stylesheet>

输入

<?xml version="1.0" encoding="UTF-8"?>
<csvImportSchema>
    <payload>
        <test>1</test>
        <test2>2</test2>
        <test3>3</test3>
        <ean>1111111111</ean>
        <productId/>
    </payload>
    <product>
        <article>722619</article>
        <ean>1111111111</ean>
    </product>
</csvImportSchema>

电流输出

<?xml version="1.0" encoding="utf-8"?>
<csvImportSchema>
    <payload>
        <productId>722619</productId>
    </payload>
</csvImportSchema>

期望的产出

<?xml version="1.0" encoding="UTF-8"?>
<csvImportSchema>
    <payload>
        <test>1</test>
        <test2>2</test2>
        <test3>3</test3>
        <ean>1111111111</ean>
        <productId>722619</productId>
    </payload>
</csvImportSchema>

共有3个答案

薛利
2023-03-14

它应该是简单的改变你的有效负载xsl: cope-of Select="@*"/

<xsl:copy-of select="*[local-name() != 'productId'] | @*"/>

i、 e.复制所有内容,除了productId,因为您是手动构建的。

这将提供所需的输出

<?xml version="1.0" encoding="utf-8"?>
<csvImportSchema>
  <payload>
    <test>1</test>
    <test2>2</test2>
    <test3>3</test3>
    <ean>1111111111</ean>
    <productId>722619</productId>
  </payload>
</csvImportSchema>
毕衡
2023-03-14

对代码的一个观察。不要使用此选项:

<xsl:variable name="ean">
    <xsl:value-of select="../ean"/>
</xsl:variable>

当你能写下这句话的时候:

<xsl:variable name="ean" select="../ean"/>

它不仅冗长,而且效率极低:不是将$ean绑定到现有节点,而是提取现有节点的字符串值,使用该字符串值形成文本节点,创建新的XML文档树,并将此文本节点添加到此新文档的内容。(我曾经通过消除这个可怕的构造,使样式表的运行速度提高了3倍。)

翟泰
2023-03-14

这个简短而简单的转换:

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

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

 <xsl:template match="productId">
  <productId>
    <xsl:value-of select="../../product/article"/>
  </productId>
 </xsl:template>
 <xsl:template match="product"/>
</xsl:stylesheet>

应用于提供的XML文档时:

<csvImportSchema>
    <payload>
        <test>1</test>
        <test2>2</test2>
        <test3>3</test3>
        <ean>1111111111</ean>
        <productId/>
    </payload>
    <product>
        <article>722619</article>
        <ean>1111111111</ean>
    </product>
</csvImportSchema>

生成所需的正确结果:

<csvImportSchema>
   <payload>
      <test>1</test>
      <test2>2</test2>
      <test3>3</test3>
      <ean>1111111111</ean>
      <productId>722619</productId>
   </payload>
</csvImportSchema>

说明:

>

  • 标识规则按“原样”复制为其选择执行的每个节点。

    匹配产品的重写模板从输出中删除此元素(通过其空主体)。

    另一个覆盖模板匹配productId,并使用取自product/article的文本节点子元素生成此元素。

  •  类似资料:
    • 我正在寻找下面输入和输出XML的XSLT(1.0)代码。 在输出XML中,C6元素下可以有任何子节点。在下面的XML中,我放了CN元素,但它可以是任何名称。 输入XML- 所需的输出XML- 先谢谢你。

    • 我正在研究一个xslt,它将用于翻译一组xmls文件,一个示例输入xml类似于:- 我想通过创建属性为id=“A12”的节点“book”的副本对其进行转换,条件是,如果属性为id=AA12的节点book不存在,则创建节点“book”的副本(属性为id=“A12”),并在副本中将id更改为“AA12”(因此其属性值更改的节点副本),但如果属性为book的节点(id=“AA12”)已经存在于xml中,

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

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

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

    • 我想用XSLT转换XML文档。按名称和属性匹配的节点及其子节点应嵌套/移动到新节点中。 从转变 到 但是我的XSLT工作不好。您有什么提示吗,XSLT文件有什么问题? 非常感谢你 安德烈亚斯 我的XSLT 输出: 我的源XML文件 我希望在转换后的输出中将v:data节点及其子节点嵌套到一个新节点中。但只有属性名为“Custon”的v:data节点。转换后的XML文档应该如下所示 如果我从XSLT