将输入xml复制到输出并从中删除不需要的命名空间

时间:2016-06-09 15:21:08

标签: xml soap xslt-2.0 ibm-datapower

我在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/”。 所以欲望输出是:

我的要求是,将完整的输入xml元素和属性复制到输出xml包括除xmlns之外的所有命名空间:soap =“http://schemas.xmlsoap.org/soap/envelope/”。 所以欲望输出是:

<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 个答案:

答案 0 :(得分:0)

如果要将所有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>

在你的帖子中然后Saxon 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>

答案 1 :(得分:0)

DataPower只实现XSLT 1.0,而不是2.0。

您可以通过复制:

来控制命名空间
<xsl:copy>
    <xsl:element name="ns:Element" namespace="http://www.xml.com/ns">
</xsl:copy>