命名空间删除xml

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了命名空间删除xml相关的知识,希望对你有一定的参考价值。

我将XML作为源代码,并且必须通过添加段进行转换。但是也必须删除在根节点中添加的命名空间。但无法删除命名空间。

有人可以分享我在哪里添加到XSLT。

所以是XML:

 <?xml version="1.0" encoding="UTF-8"?>
                    <Header 
                      xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/">
                        <Main>
                            <Parent2>
                                <status>12</status>
                                <statusmsg>Helo</statusmsg>
                            </Parent2>
                            <Parent3>
                                <Child1>112</Child1>
                                <Child2>Hai</Child2>
                            </Parent3>
                            <Parent4>
                                <Child3>Valley</Child3>
                                <Parent5>
                                    <Child7>Kind</Child7>
                                    <Child8>Pls</Child8>
                                </Parent5>
                            </Parent4>
                        </Main>
                    </Header>

目标XML:

 <Header>
                        <Main Mainattribute="1">
                            <Parent2 childattribute="1">
                                <status>12</status>
                                <statusmsg>Helo</statusmsg>
                            </Parent2>
                            <Parent3 childattribute="1">
                                <Child1>112</Child1>
                                <Child2>Hai</Child2>
                            </Parent3>
                            <Parent4 childattribute="1">
                                <Child3>Valley</Child3>
                                <Parent5>
                                    <Child7>Kind</Child7>
                                    <Child8>Pls</Child8>
                                </Parent5>
                            </Parent4>
                        </Main>
                    </Header>

XSLT从以下链接尝试:Populate Attribute and values to all parent nodes of the XML file from 4th parent node

        <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
            <xsl:output method="xml" indent="yes"/>
            <xsl:template match="Main">
                <xsl:copy>
                    <xsl:copy-of select="@*"/>
                    <xsl:attribute name="Mainattribute"><xsl:value-of select="1"/></xsl:attribute>
                    <xsl:apply-templates mode="parent_mode"/>
                </xsl:copy>
            </xsl:template>
            <xsl:template match="*" mode="parent_mode">
                <xsl:copy>
                    <xsl:copy-of select="@*"/>
                    <xsl:attribute name="childattribute"><xsl:value-of select="1"/></xsl:attribute>
                    <xsl:apply-templates/>
                </xsl:copy>
            </xsl:template>
            <xsl:template match="*">
                <xsl:copy>
                    <xsl:copy-of select="@*"/>
                    <xsl:apply-templates/>
                </xsl:copy>
            </xsl:template>
        </xsl:stylesheet>
答案

未使用的命名空间声明不应该导致任何问题。但是如果你想要摆脱它,在XSLT 1.0中,你将不得不使用xsl:element而不是使用xsl:copy来创建一个新元素,因为后者会将命名空间声明复制到。

试试这个XSLT

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

    <xsl:template match="Main">
        <Main>
            <xsl:copy-of select="@*"/>
            <xsl:attribute name="Mainattribute"><xsl:value-of select="1"/></xsl:attribute>
            <xsl:apply-templates mode="parent_mode"/>
        </Main>
    </xsl:template>

    <xsl:template match="*" mode="parent_mode">
        <xsl:element name="{local-name()}">
            <xsl:copy-of select="@*"/>
            <xsl:attribute name="childattribute"><xsl:value-of select="1"/></xsl:attribute>
            <xsl:apply-templates/>
        </xsl:element>
    </xsl:template>

    <xsl:template match="*">
        <xsl:element name="{local-name()}">
            <xsl:copy-of select="@*"/>
            <xsl:apply-templates/>
        </xsl:element>
    </xsl:template>
</xsl:stylesheet>

如果你可以使用XSLT 2.0,你可以将copy-namespaces添加到xsl:copy

<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:output method="xml" indent="yes"/>

    <xsl:template match="Main">
        <xsl:copy copy-namespaces="no">
            <xsl:copy-of select="@*"/>
            <xsl:attribute name="Mainattribute"><xsl:value-of select="1"/></xsl:attribute>
            <xsl:apply-templates mode="parent_mode"/>
        </xsl:copy>
    </xsl:template>

    <xsl:template match="*" mode="parent_mode">
        <xsl:copy copy-namespaces="no">
            <xsl:copy-of select="@*"/>
            <xsl:attribute name="childattribute"><xsl:value-of select="1"/></xsl:attribute>
            <xsl:apply-templates/>
        </xsl:copy>
    </xsl:template>

    <xsl:template match="*">
        <xsl:copy copy-namespaces="no">
            <xsl:copy-of select="@*"/>
            <xsl:apply-templates/>
        </xsl:copy>
    </xsl:template>
</xsl:stylesheet>
另一答案

有一种更简单的XSLT 2.0方法可供使用

<xsl:copy-of select="/" copy-namespaces="no"/>

它会删除所有未使用的命名空间。

以上是关于命名空间删除xml的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 java dom 从 xml 中删除命名空间?

从 XML 中删除多个 XML 命名空间

删除 XML 命名空间,同时忽略根中的命名空间

如何处理XML命名空间

移除 xml 的命名空间

XML 属性未获取命名空间前缀