xpath表达式给出的多个值(Xpath expression gives multiple val

2019-10-21 19:00发布

我有我需要匹配值的要求

买方,BilltoParty,SHIPTO可在值AGIIS-EBID or EAN or GLN

我使用XPath1.0提取这些价值和使用的条件。

我能得到正确的价值,为买家*

我面临的问题是SHIPTO和Billtoparty

Xpath的为SHIPTO和收单方获得价值

//*[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

输入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的,也让我知道我做的条件匹配的方式是否正确?

期待输出

我期待的变量买家,SHIPTO,收单方应该匹配值== AGIIS-EBID ,但我使用XPath给

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

Answer 1:

从看你的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">

然后你就可以“简单化”的变量例如,这

<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">


文章来源: Xpath expression gives multiple values
标签: xslt xpath