命名空间问题

时间:2016-09-23 18:50:42

标签: xslt xslt-1.0

  

我有一个输入xml,其中S:Fault xmlns:ns4 =" http://www.w3.org/2003/05/soap-envelope"这给从错误节点获取数据带来了麻烦。

<?xml version="1.0" encoding="UTF-8"?>
<S:Envelope xmlns:S="http://schemas.xmlsoap.org/soap/envelope/">
    <S:Body>
        <S:Fault xmlns:ns4="http://www.w3.org/2003/05/soap-envelope">
            <faultcode>S:Server</faultcode>
            <faultstring>The GTIN is not valid or the system can not map the Company Prefix to an existing Company Prefix from the Setting</faultstring>
        </S:Fault>
    </S:Body>
</S:Envelope>
  

Xlst代码无效...

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:ns0="example" xmlns:S="http://schemas.xmlsoap.org/soap/envelope/"
xmlns:ns4="http://www.w3.org/2003/05/soap-envelope"
exclude-result-prefixes="S ns4">
<xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/>

    <xsl:template match="/S:Envelope">
            <ns0:MT_CreateSerialNumberResponse_IB xmlns:ns0="example">
            <serialNumberList xmlns="urn:abcd:1">
                <body>
                    <message>
                        <xsl:value-of select="S:Body/ns4:Fault/ns4:faultstring"/>
                    </message>
                </body>
            </serialNumberList>
        </ns0:MT_CreateSerialNumberResponse_IB>
    </xsl:template>
</xsl:stylesheet>
  

预期结果...如果我错过了某些内容,请帮助查找代码错误

<ns0:MT_CreateSerialNumberResponse_IB xmlns:ns0="example">
    <serialNumberList xmlns="urn:abcd:1">
        <body><message>The GTIN is not valid or the system can not map the Company Prefix to an existing Company Prefix from the Setting</message>
        </body>
    </serialNumberList>
</ns0:MT_CreateSerialNumberResponse_IB>

2 个答案:

答案 0 :(得分:1)

试试这个

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:ns0="example" xmlns:S="http://schemas.xmlsoap.org/soap/envelope/"
xmlns:ns4="http://www.w3.org/2003/05/soap-envelope"
exclude-result-prefixes="S ns4">
<xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/>

    <xsl:template match="/S:Envelope">
            <ns0:MT_CreateSerialNumberResponse_IB xmlns:ns0="example">
            <serialNumberList xmlns="urn:abcd:1">
                <body>
                    <message>
                        <xsl:value-of select="S:Body/S:Fault/faultstring"/>
                    </message>
                </body>
            </serialNumberList>
        </ns0:MT_CreateSerialNumberResponse_IB>
    </xsl:template>
</xsl:stylesheet>

答案 1 :(得分:1)

  1. 输入XML中没有名称以Start()为前缀的节点。这使得名称空间声明ns4:完全冗余(在XML和XSLT中)。

  2. 仅继承默认名称空间声明(不带前缀)。 xmlns:ns4="http://www.w3.org/2003/05/soap-envelope"元素在作用域中没有前缀,也没有默认的名称空间声明。这意味着它处于无命名空间,并且它的路径(来自faultstring的上下文)是:

    S:Envelope