XSL中的Xpath1.0 local-name()与名称空间

时间:2015-06-30 16:19:06

标签: xml xslt xpath

出于某种原因,当我使用没有local-name()的正确XPath时,我没有得到任何价值。

我尝试过的非工作XPath:

  1. //mon:ReturnUpdateRequest/urn:Header/urn:DocumentIdentifier/text()
  2. soapenv:Envelope/soapenv:Body/mon:ReturnUpdateRequest/urn:Header/urn:DocumentIdentifier/text()
  3. 以上表达式都在XPath工具和XMLspy中提供了正确的值。

    使用local-name()工作XPath:

    /*[local-name()='Envelope']/*[local-name()='Body']/*[local-name()='ReturnUpdateRequest']/*[local-name()='Header']/*[local-name()='DocumentIdentifier']
    

    输入请求:

    <soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:mon="Monsanto:ServiceReturnUpdate" xmlns:urn="urn:monsanto:uscomm:service:header">
        <soapenv:Body>
            <mon:ReturnUpdateRequest Version="?">
                <urn:Header>
                    <urn:DocumentIdentifier>1013083</urn:DocumentIdentifier>
                    <urn:DocumentDateTime>2015-06-11T17:46:11.092-03:00</urn:DocumentDateTime>
                    <urn:From>
                        <urn:PartnerName>1013083</urn:PartnerName>
                        <urn:PartnerIdentifier type="SAP_ID">1013083</urn:PartnerIdentifier>
                        <!--Zero or more repetitions:-->
                    </urn:From>
                    <!--Optional:-->
                    <urn:To>
                        <urn:PartnerName>1013083</urn:PartnerName>
                        <urn:PartnerIdentifier type="SAP_ID">0001013083</urn:PartnerIdentifier>
                        <!--Zero or more repetitions:-->
                    </urn:To>
                    <urn:DataSource>APP</urn:DataSource>
                    <!--Optional:-->
                    <urn:SoftwareVersion>?</urn:SoftwareVersion>
                </urn:Header>
            </mon:ReturnUpdateRequest>
        </soapenv:Body>
    </soapenv:Envelope>
    

    代码段:

    <xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0"  xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:mon="ServiceReturnDetail" xmlns:urn="urn:sap-com:document:sap:soap:functions:mc-style">
        <xsl:output method="xml" indent="yes"/>
        <xsl:template match="/">
            <soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:urn="urn:sap-com:document:sap:soap:functions:mc-style">
                <soapenv:Header/>
                <soapenv:Body>
                    <urn:YSdsaUsseedRetUpdate>
                        <IIdent>
                            <!--    <xsl:value-of select="/*[local-name()='Envelope']/*[local-name()='Body']/*[local-name()='ReturnUpdateRequest']/*[local-name()='Header']/*[local-name()='DocumentIdentifier']"/>-->
                            <xsl:value-of select="//mon:ReturnUpdateRequest/urn:Header/urn:DocumentIdentifier/text()"/>
                        </IIdent>
                        <ISrc>
                            <!--<xsl:value-of select="/*[local-name()='Envelope']/*[local-name()='Body']/*[local-name()='ReturnUpdateRequest']/*[local-name()='Header']/*[local-name()='DocumentDateTime']"/>-->
                            <xsl:value-of select="/soapenv:Envelope/soapenv:Body/mon:ReturnUpdateRequest/urn:Header/urn:DocumentDateTime"/>
                        </ISrc>
                    </urn:YSdsaUsseedRetUpdate>
                </soapenv:Body>
            </soapenv:Envelope>
        </xsl:template>
    </xsl:stylesheet>
    

    我做错了什么?

1 个答案:

答案 0 :(得分:1)

  

我做错了?

在输入XML中,ReturnUpdateRequest位于URI为"Monsanto:ServiceReturnUpdate"的命名空间中。您正尝试将其作为mon:ReturnUpdateRequest处理 - 但您的样式表将mon前缀绑定到完全不同的URI:

xmlns:mon="ServiceReturnDetail"

urn前缀存在类似问题。

这是一个有效的例子:

<xsl:stylesheet version="1.0"  
xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" 
xmlns:mon="Monsanto:ServiceReturnUpdate" 
xmlns:hdr="urn:monsanto:uscomm:service:header">
<xsl:output method="xml" indent="yes"/>

<xsl:template match="/">
        <soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:urn="urn:sap-com:document:sap:soap:functions:mc-style">
            <soapenv:Header/>
            <soapenv:Body>
                <urn:YSdsaUsseedRetUpdate>
                    <IIdent>
                        <xsl:value-of select="//mon:ReturnUpdateRequest/hdr:Header/hdr:DocumentIdentifier"/>
                    </IIdent>
                </urn:YSdsaUsseedRetUpdate>
            </soapenv:Body>
        </soapenv:Envelope>
</xsl:template>

</xsl:stylesheet>

注意:既然你想在输出中使用相同的urn前缀,但是将它绑定到不同的命名空间,我使用了不同的前缀来处理输入。这里重要的是URI,而不是前缀本身。