我有要求我需要匹配值
买方,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
答案 0 :(得分:2)
从查看您的XSLT,并看到您的Shipto
和Billto
变量具有相同的声明,我认为您所说的是这些当前匹配四个节点(或更确切地说属性),但你只想要一个。
具体来说,从查看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">