Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/xslt/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Xml 复制节点如果_Xml_Xslt_Copy_Xmlnode - Fatal编程技术网

Xml 复制节点如果

Xml 复制节点如果,xml,xslt,copy,xmlnode,Xml,Xslt,Copy,Xmlnode,我无法完全理解这一点——我只很少使用XSLT。在某种情况下,我需要复制一个节点。我看过“模板”和“复制”,但不知道如何让它们一起工作 我拥有的XML <data> <product> <productnumber>655.43</productnumber> <parentproduct></parentproduct> </product> <product> &

我无法完全理解这一点——我只很少使用XSLT。在某种情况下,我需要复制一个节点。我看过“模板”和“复制”,但不知道如何让它们一起工作

我拥有的XML

<data>
  <product>
    <productnumber>655.43</productnumber>
    <parentproduct></parentproduct>
  </product>
  <product>
    <productnumber>655.38</productnumber>
    <parentproduct>655.43</parentproduct>
  </product>
</data>

655.43
655.38
655.43
我想要的XML

<data>
  <product>
    <productnumber>655</productnumber>
    <parentproduct></parentproduct>
  </product>
  <product>
    <productnumber>655.43</productnumber>
    <parentproduct>655</parentproduct>
  </product>
  <product>
    <productnumber>655.38</productnumber>
    <parentproduct>655</parentproduct>
  </product>
<data>

655
655.43
655
655.38
655
因此,如果parentproduct为空,则应该复制产品节点

我正在处理的xsl看起来像

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:fo="http://www.w3.org/1999/XSL/Format">
<xsl:output cdata-section-elements="column"/>
<xsl:template match="/data/product">
    <xsl:copy>
        <xsl: apply-templates select="/data/product"/>
    </xsl:copy>
</xsl:template>

所以我需要在apply模板上的select语句中添加一些“东西”…但是我想不出来

提前感谢您的帮助!
关于/Snedker

我建议您最好使用
,它可以复制当前节点的完整深度副本。

我感觉这里仍然缺少一些内容,但请尝试以下样式表:

XSLT1.0

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

<xsl:key name="product-by-parent" match="productnumber" use="substring-before(., '.')" />

<xsl:template match="/">
    <data>
        <!-- for each unique integer part of productnumber -->
        <xsl:for-each select="data/product/productnumber[count(. | key('product-by-parent', substring-before(., '.'))[1]) = 1]">
            <xsl:variable name="parent" select=" substring-before(., '.')" />
            <product>
                <productnumber><xsl:value-of select="$parent"/></productnumber>
                <parentproduct/>
            </product>
            <!-- for each productnumber starting with the current integer -->
            <xsl:for-each select="key('product-by-parent',  $parent)">
                <product>
                    <productnumber><xsl:value-of select="."/></productnumber>
                    <parentproduct><xsl:value-of select="$parent"/></parentproduct>
                </product>
            </xsl:for-each>
        </xsl:for-each>
    </data>
</xsl:template>

</xsl:stylesheet>


IMHO,您的输出模式可以通过将子产品包装到公共父元素中来改进。

“因此,如果parentproduct为空,则应该复制产品节点。”这不是您的示例所显示的内容-请澄清。655.43表示655是主产品(ProductID),43是变体(VariantID)。就表格而言,必须有一行具有ProductID且没有VariantID(master)。接下来,所有变量行都有ProductID+VariantID。我的问题是master(没有父产品)也充当变体(因此产品中的内容)。“我想要的XML”显示了一个主产品+两个变体。希望这能澄清。谢谢你的努力!恐怕我还没有完全理解你。输入XML显示655.43是655.38的父产品。此信息在转换过程中丢失。你确定这就是你想要的吗?是的,我确定。问题是655.43同时保存了父级信息(空)和变量信息(.43)。我需要拆分此信息,以便父产品没有变体信息。因此,所有变体都指向没有变体信息的父级(在本例中为:655)。然后所有变体都应该有655我是否正确理解,那么解决方案应该忽略所有
parentproduct
标记-空或不空-并将
productnumber
“变体”分组到一个公共父项下,由数字的整数部分给出?我发现的信息表明,的副本不适合对属性进行后续操作。但我是个笨蛋,所以我可能错了。Thx为您输入!溴