Заменить корневой элемент только другим именем - XSLT - PullRequest
0 голосов
/ 13 февраля 2019

Я застрял с незначительными изменениями для XSLT, потому что я хотел бы заменить верхний корневой узел другим именем.Я попытался с помощью XSLT ниже добавить новый корень, но не смог удалить начальный корень входного XML.Может кто-нибудь, пожалуйста, дайте мне знать, что мне здесь не хватает.Спасибо.

Ниже приведен пробный код XSLT.

                     <?xml version='1.0' encoding='utf-8'?>
                    <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
                        <xsl:output method="xml" encoding="UTF-8"/>

                        <xsl:template match="root">
                            <ns:NewParent xmlns:ns="http://test.com/user">
                                <xsl:copy-of select="." />
                            </ns:NewParent>
                        </xsl:template>

                        <xsl:template match="@*|node()">
                            <xsl:copy>
                                <xsl:apply-templates select="@*|node()"/>
                            </xsl:copy>
                        </xsl:template>

Входной XML:

                    <root>
                        <root>
                            <a>TestA</a>
                            <b>Testb</b>
                            <c>Testc</c>
                        </root>
                        <root>
                            <a>TestA1</a>
                            <b>Testb1</b>
                            <l>Testl1</l>
                        </root>
                        <root>
                            <a>TestA12</a>
                            <b>Testb12</b>
                            <l>Testl2</l>
                        </root>
                    </root>

Выходной / требуемый XML:

                    <ns:NewParent xmlns:ns="http://test.com/user">
                        <root>
                            <a>TestA</a>
                            <b>Testb</b>
                            <c>Testc</c>
                        </root>
                        <root>
                            <a>TestA1</a>
                            <b>Testb1</b>
                            <l>Testl1</l>
                        </root>
                        <root>
                            <a>TestA12</a>
                            <b>Testb12</b>
                            <l>Testl2</l>
                        </root>
                    </ns:NewParent>

1 Ответ

0 голосов
/ 13 февраля 2019

Соответствующий шаблон root делает <xsl:copy-of select="." />, который копирует сам узел, а также все дочерние элементы.Вместо этого вы должны сделать <xsl:copy-of select="node()" />.

<xsl:template match="root">
    <ns:NewParent xmlns:ns="http://test.com/user">
        <xsl:copy-of select="node()" />
    </ns:NewParent>
</xsl:template>

Обратите внимание, что в этом случае вам не понадобится шаблон идентификации.Просто этот шаблон будет делать.Если вы действительно хотите использовать шаблон идентификации или если вам нужно преобразовать другие узлы, используйте xsl:apply-templates вместо

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:output method="xml" encoding="UTF-8"/>

    <xsl:template match="/root">
        <ns:NewParent xmlns:ns="http://test.com/user">
            <xsl:apply-templates />
        </ns:NewParent>
    </xsl:template>

    <xsl:template match="@*|node()">
        <xsl:copy>
            <xsl:apply-templates select="@*|node()"/>
        </xsl:copy>
    </xsl:template>
</xsl:stylesheet>

Обратите внимание, что шаблон теперь соответствует /root, чтобы он соответствовал только верхнему уровнюroot элемент, а не его дочерние элементы.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...