Удалить префикс из элемента - PullRequest
0 голосов
/ 05 июня 2019

Мне нужно удалить префикс из элемента

У меня есть этот XML

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

У меня есть это письмо, но результат не тот, который я ожидаю, как 2-йэлемент также получает префикс.

<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 Ответ

1 голос
/ 05 июня 2019

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

Попробуйте это 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() не будет включать префикс.

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