Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/xml/15.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 使用XSL将属性移动到子元素_Xml_Xslt - Fatal编程技术网

Xml 使用XSL将属性移动到子元素

Xml 使用XSL将属性移动到子元素,xml,xslt,Xml,Xslt,我有个无法解决的问题。下面是我所拥有的xml结构的一个片段: <body> <tu creationdate="01022015" creationid="author1" changedate="02022015" changeid="author2"> <tuv xml:lang="it-IT"> <seg>Questo è testo</seg>

我有个无法解决的问题。下面是我所拥有的xml结构的一个片段:

    <body>
        <tu creationdate="01022015" creationid="author1" changedate="02022015" changeid="author2">
            <tuv xml:lang="it-IT">
                <seg>Questo è testo</seg>
            </tuv>
            <tuv xml:lang="en-GB">
                <seg>This is a test</seg>
            </tuv>
            <tuv xml:lang="de-DE">
                <seg>Das ist ein Test</seg>
            </tuv>
        </tu>
        <tu>
        </tu>
    </body>
</tmx>

奎斯托
这是一个测试
Das ist ein测试
我希望在不覆盖任何内容的情况下将所有属性从元素移动到子元素。大概是这样的:

    <body>
        <tu>
            <tuv xml:lang="it-IT" creationdate="01022015" creationid="author1" changedate="02022015" changeid="author2">
                <seg>Questo è testo</seg>
            </tuv>
            <tuv xml:lang="en-GB" creationdate="01022015" creationid="author1" changedate="02022015" changeid="author2">
                <seg>This is a test</seg>
            </tuv>
            <tuv xml:lang="de-DE" creationdate="01022015" creationid="author1" changedate="02022015" changeid="author2">
                <seg>Das ist ein Test</seg>
            </tuv>
        </tu>
        <tu>
        </tu>
    </body>
</tmx>

奎斯托
这是一个测试
Das ist ein测试
这是我迄今为止最好的尝试:

<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 method="xml" indent="yes"/>

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

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

</xsl:stylesheet>

但不幸的是,这总是覆盖元素中的xml:lang属性。 有什么建议吗

先谢谢你

恩里科

这总是覆盖元素中的xml:lang属性

它不会覆盖它。您只是没有在
xsl:apply templates
指令中包含现有属性(尽管您包含了
node()
两次,从而复制了所有子元素)

此外,为了获得所需的结果,还必须从父
tu
元素中删除属性

试着这样做:

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:strip-space elements="*"/>

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

<xsl:template match="tu/@*"/>

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

</xsl:stylesheet>



注意使用
xsl:copy of
添加属性。这是因为在我们添加了与之匹配的空模板之后,使用
xsl:apply templates
不会有任何作用。

非常感谢,它现在可以工作了!我是个新手,我刚刚学到了一些新东西:)