从元素中删除前缀

时间:2019-06-05 13:12:43

标签: xml xslt

我需要从元素中删除前缀

我有这个XML

<ns:order xmlns:ns="namespace">
<row>
        <id>1</id>
    </row>
    <row>
        <id>2</id>
    </row>
</ns:order>

我收到了这封电子邮件,但结果出乎我的意料,因为第二个元素也获得了前缀。

<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后得到的:

<?xml version="1.0" encoding="UTF-8"?>
<ns:order xmlns:ns="namespace">
    <ns:order>
        <row>
            <id>1</id>
        </row>
        <row>
            <id>2</id>
        </row>
    </ns:order>
</ns:order>

我想要这个:

<?xml version="1.0" encoding="UTF-8"?>
<ns:order xmlns:ns="namespace">
    <order>
        <row>
            <id>1</id>
        </row>
        <row>
            <id>2</id>
        </row>
    </order>
</ns:order>

1 个答案:

答案 0 :(得分:1)

您当前正在尝试添加一个新元素作为当前元素的父元素。如果您添加了一个新子代并将其添加到现有子代中,那将更有意义。

尝试使用此XSLT

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

或者,不使用变量。...

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

请注意,使用local-name()代替name()是因为local-name()将不包含任何前缀。