将节点属性复制到xslt中的新节点

时间:2016-04-20 09:13:33

标签: xml xslt xslt-1.0

我有这样的xml:

<definitions xmlns:xxx="test.com" xmlns:yyy="test2.com" test="test">
</definitions>

我需要像这样转换:

<test xmlns:xxx="test.com" xmlns:yyy="test2.com" test="test">
</test>

我写了一个像这样的xslt:

<xsl:template match="definitions">
    <xsl:element name="test">
        <xsl:copy-of select="@*" />
    </xsl:element>
</xsl:template>

这会产生:

<test test="test">
</test>

但它不包含xmlns:xxx="test.com" xmlns:yyy="test2.com"名称空间为什么?

我如何同时复制命名空间?

3 个答案:

答案 0 :(得分:3)

  

它不包含xmlns:xxx =&#34; test.com&#34;的xmlns:YYY =&#34; test2.com&#34;命名空间为什么?

它不包含命名空间声明,因为它们不在任何地方使用 - 因此XSLT处理器不会输出它们。

  

我如何同时复制命名空间?

我不明白为什么你会想要它们 - 但如果你坚持,你可以明确地复制它们:

<xsl:template match="definitions">
    <test>
        <xsl:copy-of select="@* | namespace::*" />
    </test>
</xsl:template>

请注意,在知道元素名称时,不必使用xsl:element

答案 1 :(得分:1)

名称空间也必须在XSL文件中声明:

<xsl:stylesheet
    version="1.0"
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
    xmlns:xxx="test.com"
    xmlns:yyy="test2.com">

答案 2 :(得分:0)

似乎您只想将元素“定义”重命名为“test”。 你可以使用这样的东西。

<xsl:template match="definitions">
<test>
    <xsl:apply-templates select="@*" />
</test>