удаление пространства имен из xml - PullRequest
0 голосов
/ 04 сентября 2018

Я получаю 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 Пробовал снизу ссылку: Заполнить Атрибут и значения для всех родительских узлов файла XML из 4-го родительского узла

        <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>

Ответы [ 2 ]

0 голосов
/ 04 сентября 2018

Существует более простой подход для XSLT 2.0, который должен использовать

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

, который делает глубокую копию, отбрасывая все неиспользуемые пространства имен.

0 голосов
/ 04 сентября 2018

Неиспользуемая декларация пространства имен не должна вызывать каких-либо проблем. Но если вы хотите избавиться от него, в 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>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...