我需要在根后面添加一个元素,并在根后面添加一个元素

时间:2019-06-05 10:20:26

标签: xml xslt

我正在尝试在XML的根元素之后添加一个元素,但是我实在无法实现。

这是我到目前为止使用XSL所获得的。

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
    <xsl:variable name="topNode" select="name(/*)"/>
    <xsl:template match="/">
        <xsl:element name="{$topNode}">
            <xsl:copy-of select="node()"/>
        </xsl:element>
    </xsl:template>
</xsl:stylesheet>

这是我必须开始的事情。

<?xml version="1.0"?>
<order_status xmlns="myNameSpace">
    <row>
        <id>1</id>
    </row>
    <row>
        <id>2</id>
    </row>
</order_status>

这是目标。

<?xml version="1.0"?>
<order_status xmlns="myNameSpace">
    <order_status>
        <row>
            <id>1</id>
        </row>
        <row>
            <id>2</id>
        </row>
    </order_status>
</order_status>

1 个答案:

答案 0 :(得分:0)

如果您使用的是xsl:element,则还需要指定“顶级节点”的命名空间

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
    <xsl:variable name="topNode" select="name(/*)"/>
    <xsl:variable name="topNodeNamespace" select="namespace-uri(/*)"/>
    <xsl:template match="/">
        <xsl:element name="{$topNode}" namespace="{$topNodeNamespace}">
            <xsl:copy-of select="node()"/>
        </xsl:element>
    </xsl:template>
</xsl:stylesheet>

或者,更改模板以匹配根元素,然后使用xsl:copy创建一个额外的副本(因为那样也会复制名称空间)

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
    <xsl:template match="/*">
        <xsl:copy>
            <xsl:copy-of select="."/>
        </xsl:copy>
    </xsl:template>
</xsl:stylesheet>