Xpath表达式给出了多个值

时间:2015-02-04 22:22:29

标签: xslt xpath

我有要求我需要匹配值

买方,BilltoParty,Shipto ,价值AGIIS-EBID or EAN or GLN

我使用XPath1.0来提取这些值并使用条件。

我能够为买方*

获得正确的价值

我面临的问题是Shipto和Billtoparty

获取Shipto和Billto的价值的Xpath

//*[local-name()='ShipNotice']/*[local-name()='ShipNoticeBody']/*[local-name()='ShipNoticePartners']/*[local-name()='OtherPartner']/*[local-name()='PartnerInformation']/*[local-name()='PartnerIdentifier']/@*[local-name()='Agency']

其值为:

Agency AGIIS-EBID
Agency SCAC
Agency AGIIS-EBID
Agency AGIIS-EBID

INPUT XML 更新了一个

 <soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:urn="urn:ces:names:specification:ces:schema:all:4:0">
    <soapenv:Header/>
    <soapenv:Body>
        <ces:ShipNotice Version="4.0" xmlns:ces="urn:ces:names:specification:ces:schema:all:4:0">
            <ces:Header>
                <ces:From>
                </ces:From>
                <ces:To>
                </ces:To>
            </ces:Header>
            <ces:ShipNoticeBody>
                <ces:ShipNoticePartners>
                    <ces:Buyer>
                        <ces:PartnerInformation>
                            <ces:PartnerIdentifier Agency="AGIIS-EBID">8049915600000</ces:PartnerIdentifier>
                        </ces:PartnerInformation>
                    </ces:Buyer>
                    <ces:OtherPartner PartnerRole="ShipFrom">
                        <ces:PartnerInformation>
                            <ces:PartnerIdentifier Agency="AGIIS-EBID">0447026370000</ces:PartnerIdentifier>
                        </ces:PartnerInformation>
                    </ces:OtherPartner>
                    <ces:OtherPartner PartnerRole="Carrier">
                        <ces:PartnerInformation>
                            <ces:PartnerIdentifier Agency="SCAC">B935</ces:PartnerIdentifier>
                        </ces:PartnerInformation>
                    </ces:OtherPartner>
                    <ces:OtherPartner PartnerRole="ShipTo">
                        <ces:PartnerInformation>
                            <ces:PartnerIdentifier Agency="AGIIS-EBID">8049915600000</ces:PartnerIdentifier>
                        </ces:PartnerInformation>
                    </ces:OtherPartner>
                    <ces:OtherPartner PartnerRole="BillToParty">
                        <ces:PartnerInformation>
                            <ces:PartnerIdentifier Agency="AGIIS-EBID">1024122440000</ces:PartnerIdentifier>
                        </ces:PartnerInformation>
                    </ces:OtherPartner>
                </ces:ShipNoticePartners>
                <ces:ShipNoticeDetails>
                </ces:ShipNoticeDetails>
            </ces:ShipNoticeBody>
        </ces:ShipNotice>
    </soapenv:Body>
</soapenv:Envelope>

以下是我正在使用的代码。

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:dpconfig="http://www.datapower.com/param/config" xmlns:cidx="urn:cidx:names:specification:ces:schema:all:4:0" xmlns:dp="http://www.datapower.com/extensions" extension-element-prefixes="dp">
    <xsl:param name="dpconfig:AGIIS-EBID" select=" 'AGIIS-EBID' "/>
    <xsl:param name="dpconfig:EAN" select="'EAN'"/>
    <xsl:param name="dpconfig:GLN" select="'GLN'"/>
    <xsl:template match="/">
        <xsl:copy-of select="."/>
        <xsl:variable name="Buyer" select="//*[local-name()='ShipNotice']/*[local-name()='ShipNoticeBody']/*[local-name()='ShipNoticePartners']/*[local-name()='Buyer']/*[local-name()='PartnerInformation']/*[local-name()='PartnerIdentifier']/@*[local-name()='Agency']"/>
        <xsl:variable name="Shipto" select="/*[local-name()='Envelope']/*[local-name()='Body']/*[local-name()='ShipNotice']/*[local-name()='ShipNoticeBody']/*[local-name()='ShipNoticePartners']/*[local-name()='OtherPartner']/*[local-name()='PartnerInformation']/*[local-name()='PartnerIdentifier']/@*[local-name()='Agency']"/>
        <xsl:variable name="Billto" select="/*[local-name()='Envelope']/*[local-name()='Body']/*[local-name()='ShipNotice']/*[local-name()='ShipNoticeBody']/*[local-name()='ShipNoticePartners']/*[local-name()='OtherPartner']/*[local-name()='PartnerInformation']/*[local-name()='PartnerIdentifier']/@*[local-name()='Agency']"/>
        <xsl:choose>
            <xsl:when test="$Buyer='AGIIS-EBID' and  $Shipto='AGIIS-EBID' and $Billto='AGIIS-EBID' or $Buyer='EAN' and  $Shipto='EAN' and $Billto='EAN' or $Buyer='GLN' and  $Shipto='GLN' and $Billto='GLN'">
            </xsl:when>
            <xsl:otherwise>
                    Partner didn't match the AGIIS-EBID or EAN or GLN
                </xsl:otherwise>
        </xsl:choose>
    </xsl:template>
</xsl:stylesheet>

有没有人可以帮我解决Xpath问题,也让我知道我做条件匹配的方式是否正确?

期待输出

我期待变量Buyer,Shipto,Billto应匹配值== AGIIS-EBID,但我使用的Xpath给出了

Agency AGIIS-EBID
Agency SCAC
Agency AGIIS-EBID
Agency AGIIS-EBID

1 个答案:

答案 0 :(得分:2)

从查看您的XSLT,并看到您的ShiptoBillto变量具有相同的声明,我认为您所说的是这些当前匹配四个节点(或更确切地说属性),但你只想要一个。

具体来说,从查看XML看,关键信息似乎在OtherPartner节点上

<ces:OtherPartner PartnerRole="ShipTo">

<ces:OtherPartner PartnerRole="BillToParty">

这意味着您需要在匹配OtherPartner的当前条件之后添加额外条件。例如,对于ShipTo,条件是:

    <xsl:variable name="Shipto" select="
         /*[local-name()='Envelope']
         /*[local-name()='Body']
         /*[local-name()='ShipNotice']
         /*[local-name()='ShipNoticeBody']
         /*[local-name()='ShipNoticePartners']
         /*[local-name()='OtherPartner'][@PartnerRole='ShipTo']
         /*[local-name()='PartnerInformation']
         /*[local-name()='PartnerIdentifier']
         /@*[local-name()='Agency']"/>

当然,正如评论中所指出的,如果你知道XML中的命名空间uri,最好在XSLT中声明它们

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
  xmlns:dpconfig="http://www.datapower.com/param/config" 
  xmlns:cidx="urn:cidx:names:specification:ces:schema:all:4:0" 
  xmlns:dp="http://www.datapower.com/extensions"
  xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" 
  xmlns:ces="urn:ces:names:specification:ces:schema:all:4:0" extension-element-prefixes="dp">

然后你可以简化&#34;例如你的变量

<xsl:variable name="Shipto" select="
        soapenv:Envelope
        /soapenv:Body
        /ces:ShipNotice
        /ces:ShipNoticeBody
        /ces:ShipNoticePartners
        /ces:OtherPartner[@PartnerRole='ShipTo']
        /ces:PartnerInformation
        /ces:PartnerIdentifier/@Agency"/>

Billto变量类似。只需更改@PartnerRole属性的条件。

此外,您可能需要考虑在最终条件周围添加一些括号

<xsl:when test="
     ($Buyer='AGIIS-EBID' and  $Shipto='AGIIS-EBID' and $Billto='AGIIS-EBID') 
     or ($Buyer='EAN' and  $Shipto='EAN' and $Billto='EAN') 
     or ($Buyer='GLN' and  $Shipto='GLN' and $Billto='GLN')">

或者更好还是这样做......

<xsl:when test="($Buyer='AGIIS-EBID' or $Buyer='EAN' or $Buyer='GLN') 
                 and $Shipto=$Buyer 
                 and $Billto=$Buyer">