Скопируйте входной XML для вывода и удалите ненужное пространство имен из него

У меня ниже XMl:

<soap:Envelope
xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/"
xmlns:ns="http:test/201/2"
xmlns:m0="http:test/201/3"
xmlns:ns0="http:test/201/4"
xmlns:ns2="http:test/201/5"
xmlns:ns1="http:test/201/6"
xmlns:ns3="http:test/201/7"
xmlns:ns6="http:test/201/8"
xmlns:ns4="http:test/201/9"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<soap:Header>
<ns0:ResponseHeader>
<ns:Env>Dev</ns:Env>
<ns:Version>1</ns:Version>
<ns:Server></ns:Server>
<ns:Name>NAME</ns:Name>
</ns0:ResponseHeader>
</soap:Header>
<soap:Body>
<ns2:ResponseData>
<ns2:Employee >
<ns2:MessageList xsi:type="ns3:Info">
<ns2:Message>
<ns4:Type>new</ns4:Type>
<ns4:Code>2</ns4:Code>
<ns4:Source>Emp</ns4:Source>
<ns4:Description>new hire</ns4:Description>
</ns2:Message>
</ns2:MessageList>
<ns2:MessageList xsi:type="ns3:Info">
<ns2:Message>
<ns4:Type>new</ns4:Type>
<ns4:Code>1</ns4:Code>
<ns4:Source>contract</ns4:Source>
<ns4:Description>new hire</ns4:Description>
</ns2:Message>
</ns2:MessageList>
</ns2:Employee>
</ns2:ResponseData>
</soap:Body>
</soap:Envelope>

Мое требование заключается в том, чтобы скопировать полные входные xml-элементы и атрибуты в выходной xml-файл, включая все пространства имен, кроме xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/". Итак, Desire Output:

Мое требование заключается в том, чтобы скопировать полные входные xml-элементы и атрибуты в выходной xml-файл, включая все пространства имен, кроме xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/". Итак, Desire Output:

<Envelope
xmlns:ns="http:test/201/2"
xmlns:m0="http:test/201/3"
xmlns:ns0="http:test/201/4"
xmlns:ns2="http:test/201/5"
xmlns:ns1="http:test/201/6"
xmlns:ns3="http:test/201/7"
xmlns:ns6="http:test/201/8"
xmlns:ns4="http:test/201/9"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<Header>
<ns0:ResponseHeader>
<ns:Env>Dev</ns:Env>
<ns:Version>1</ns:Version>
<ns:Server></ns:Server>
<ns:Name>NAME</ns:Name>
</ns0:ResponseHeader>
</Header>
<Body>
<ns2:ResponseData>
<ns2:Employee >
<ns2:MessageList xsi:type="ns3:Info">
<ns2:Message>
<ns4:Type>new</ns4:Type>
<ns4:Code>2</ns4:Code>
<ns4:Source>Emp</ns4:Source>
<ns4:Description>new hire</ns4:Description>
</ns2:Message>
</ns2:MessageList>
<ns2:MessageList xsi:type="ns3:Info">
<ns2:Message>
<ns4:Type>new</ns4:Type>
<ns4:Code>1</ns4:Code>
<ns4:Source>contract</ns4:Source>
<ns4:Description>new hire</ns4:Description>
</ns2:Message>
</ns2:MessageList>
</ns2:Employee>
</ns2:ResponseData>
</Body>
</Envelope>

2 ответа

DataPower реализует только XSLT 1.0, а не 2.0.

Вы можете управлять своими пространствами имен через Copy:

<xsl:copy>
    <xsl:element name="ns:Element" namespace="http://www.xml.com/ns">
</xsl:copy>

Если вы хотите преобразовать все soap:foo элементы к foo элементы в пространстве имен и удалить soap пространство имен затем с помощью

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
    xmlns:xs="http://www.w3.org/2001/XMLSchema"
    xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/"
    exclude-result-prefixes="xs soap"
    version="2.0">

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

    <xsl:template match="soap:*">
        <xsl:element name="{local-name()}">
            <xsl:copy-of select="namespace::*[not(. = namespace-uri(current()))]"/>
            <xsl:apply-templates select="@* | node()"/>
        </xsl:element>
    </xsl:template>

</xsl:stylesheet>

должно хватить, предполагая, что ваш корневой элемент находится в пространстве имен soap и имеет все объявления пространства имен в области видимости.

Когда я применяю выше XSLT для входного образца

<?xml version="1.0" encoding="UTF-8"?>
<soap:Envelope
    xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/"
    xmlns:ns="http:test/201/2"
    xmlns:m0="http:test/201/3"
    xmlns:ns0="http:test/201/4"
    xmlns:ns2="http:test/201/5"
    xmlns:ns1="http:test/201/6"
    xmlns:ns3="http:test/201/7"
    xmlns:ns6="http:test/201/8"
    xmlns:ns4="http:test/201/9"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
    <soap:Header>
        <ns0:ResponseHeader>
            <ns:Env>Dev</ns:Env>
            <ns:Version>1</ns:Version>
            <ns:Server></ns:Server>
            <ns:Name>NAME</ns:Name>
        </ns0:ResponseHeader>
    </soap:Header>
    <soap:Body>
        <ns2:ResponseData>
            <ns2:Employee >
                <ns2:MessageList xsi:type="ns3:Info">
                    <ns2:Message>
                        <ns4:Type>new</ns4:Type>
                        <ns4:Code>2</ns4:Code>
                        <ns4:Source>Emp</ns4:Source>
                        <ns4:Description>new hire</ns4:Description>
                    </ns2:Message>
                </ns2:MessageList>
                <ns2:MessageList xsi:type="ns3:Info">
                    <ns2:Message>
                        <ns4:Type>new</ns4:Type>
                        <ns4:Code>1</ns4:Code>
                        <ns4:Source>contract</ns4:Source>
                        <ns4:Description>new hire</ns4:Description>
                    </ns2:Message>
                </ns2:MessageList>
            </ns2:Employee>
        </ns2:ResponseData>
    </soap:Body>
</soap:Envelope>

в твоем посте то саксонский 9.6 создает результат

<?xml version="1.0" encoding="UTF-8"?><Envelope xmlns:ns="http:test/201/2" xmlns:m0="http:test/201/3" xmlns:ns0="http:test/201/4" xmlns:ns2="http:test/201/5" xmlns:ns1="http:test/201/6" xmlns:ns3="http:test/201/7" xmlns:ns6="http:test/201/8" xmlns:ns4="http:test/201/9" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
    <Header>
        <ns0:ResponseHeader>
            <ns:Env>Dev</ns:Env>
            <ns:Version>1</ns:Version>
            <ns:Server/>
            <ns:Name>NAME</ns:Name>
        </ns0:ResponseHeader>
    </Header>
    <Body>
        <ns2:ResponseData>
            <ns2:Employee>
                <ns2:MessageList xsi:type="ns3:Info">
                    <ns2:Message>
                        <ns4:Type>new</ns4:Type>
                        <ns4:Code>2</ns4:Code>
                        <ns4:Source>Emp</ns4:Source>
                        <ns4:Description>new hire</ns4:Description>
                    </ns2:Message>
                </ns2:MessageList>
                <ns2:MessageList xsi:type="ns3:Info">
                    <ns2:Message>
                        <ns4:Type>new</ns4:Type>
                        <ns4:Code>1</ns4:Code>
                        <ns4:Source>contract</ns4:Source>
                        <ns4:Description>new hire</ns4:Description>
                    </ns2:Message>
                </ns2:MessageList>
            </ns2:Employee>
        </ns2:ResponseData>
    </Body>
</Envelope>
Другие вопросы по тегам