Получение пространства имен добавлено на основе условия для XML с использованием XSL - PullRequest
0 голосов
/ 28 сентября 2018

Я пытаюсь добавить пространства имен в xml на основе условия.Но условие не работает.Может кто-нибудь, пожалуйста, помогите.

Входной XML:

                    <n0:MainTag xmlns:n0='http://abc123.com' xmlns:prx='urn:testing.com' xmlns:soap-env='http://schemas.xmlsoap.org/soap/envelope/'>
                    <header>M</header>
                    <Data>
                        <Child>623471568753</Child>

                    </Data>
                </n0:MainTag>

Выходной XML:

                    <?xml version="1.0" encoding="UTF-8"?>
                <ns0:MainTag xmlns:ns0="http://xyz987.com">
                    <header>M</header>
                    <Data>
                        <Child>623471568753</Child>
                    </Data>
                </n0:MainTag>

2-й Ввод: Входной XML:

                <n0:DifferentTag xmlns:n0='http://abc123.com' xmlns:prx='urn:testing.com' xmlns:soap-env='http://schemas.xmlsoap.org/soap/envelope/'>
                <header>M</header>
                <Datum>
                    <Child>Test123</Child>

                </Datum>
            </n0:DifferentTag>

Выходной XML:

                <n0:DifferentTag xmlns:ns0="http://QWR.com">
                <header>M</header>
                <Datum>
                    <Child>Test123</Child>

                </Datum>
            </n0:DifferentTag>

XSL Попытка:

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

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

<xsl:template match="MainTag">
    <xsl:element name="ns0:{local-name()}" namespace="http://xyz987.com">
        <xsl:apply-templates select="@* | node()" />
    </xsl:element>
</xsl:template>

<xsl:template match="MainTag">
    <xsl:element name="ns0:{local-name()}" namespace="http://QWR.com">
        <xsl:apply-templates select="@* | node()" />
    </xsl:element>
</xsl:template>

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

Условие: проверить имя тега в исходном XML

1 Ответ

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

Проблема в том, что во входном XML-коде и MainTag, и DifferentTag находятся в "http://abc123.com",, но вы учитываете это в своем XSLT, поэтому он пытается сопоставить теги вnamespace.

Вам необходимо объявить префикс в вашем XSLT и использовать его в совпадении.

Также обратите внимание, что ваш текущий XSLT имеет два шаблона, соответствующих MainTag, когда один из них, вероятно, должен совпадатьDifferentTag.

Попробуйте это XSLT:

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
                              xmlns:n0="http://abc123.com"
                              exclude-result-prefixes="n0">
<xsl:output encoding='UTF-8' indent='yes' method='xml'/>

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

<xsl:template match="n0:MainTag">
    <xsl:element name="ns0:{local-name()}" namespace="http://xyz987.com">
        <xsl:apply-templates select="@* | node()" />
    </xsl:element>
</xsl:template>

<xsl:template match="n0:DifferentTag">
    <xsl:element name="ns0:{local-name()}" namespace="http://QWR.com">
        <xsl:apply-templates select="@* | node()" />
    </xsl:element>
</xsl:template>

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

РЕДАКТИРОВАТЬ: Если вы действительно не знаете пространства имен во входном XML, попробуйте этот XSLT вместо ...

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">

<xsl:output encoding='UTF-8' indent='yes' method='xml'/>

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

<xsl:template match="*[local-name() = 'MainTag']">
    <xsl:element name="ns0:{local-name()}" namespace="http://xyz987.com">
        <xsl:apply-templates select="@* | node()" />
    </xsl:element>
</xsl:template>

<xsl:template match="*[local-name() = 'DifferentTag']">
    <xsl:element name="ns0:{local-name()}" namespace="http://QWR.com">
        <xsl:apply-templates select="@* | node()" />
    </xsl:element>
</xsl:template>

<xsl:template match="*/*">
    <xsl:element name="{local-name()}">
        <xsl:apply-templates select="@* | node()" />
    </xsl:element>
</xsl:template>
</xsl:stylesheet>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...