【发布时间】:2019-09-18 12:27:26
【问题描述】:
要求是在具有 HL03='P' 和 HL01='3' 的 HL1Loop 中找到 MAN02 段的值(在一个可能有数十个 HL1Loops 的文件中,但出于目的,我只包含了几个复制问题。)
我做了这么多工作:
//*[local-name()='HLLoop1'][.//*[HL03='P'] and .//*[HL01='3']]
将返回所需的 HLLoop1(下面有示例数据)。我有一个获得该特定项目的理由,在这里解释太长了(解析代表 856 EDI 提前发货通知文档的 Microsoft BizTalk 架构)。可能还有其他 HLLoop1,其中也有“MAN02”,这就是我需要的。
现在我只想返回 MAN02 值。 试过这个,但是不行:
//*[local-name()='HLLoop1']//MAN/MAN02[.//*[HL03='P'] and .//*[HL01='3']]
我是否需要添加更多前缀才能让 HL03 返回几个节点,像这样?
//*[local-name()='HLLoop1']//MAN/MAN02[.//.//.//*[HL03='P'] and .//.//.//*[HL01='3']]
或者我会在最后添加一些这样的东西:
//*[local-name()='HLLoop1'][.//*[HL03='P'] and .//*[HL01='3']]//*MAN02
这会产生“额外的非法令牌”,我认为也许在正确的位置添加更多括号可以解决它。
我知道这是把轴和“where 子句”弄直的问题。
这里的例子: http://www.xpathtester.com/xpath/3005df62b369fd0fff86e7b3e492a377
数据
<ns0:X12_00401_856 xmlns:ns0="http://schemas.microsoft.com/BizTalk/EDI/X12/2006">
<ns0:HLLoop1>
<ns0:HL>
<HL01>2</HL01>
<HL02>1</HL02>
<HL03>O</HL03>
</ns0:HL>
<ns0:PRF>
<PRF01>287775</PRF01>
</ns0:PRF>
</ns0:HLLoop1>
<ns0:HLLoop1>
<ns0:HL>
<HL01>3</HL01>
<HL02>2</HL02>
<HL03>P</HL03>
</ns0:HL>
<ns0:MAN>
<MAN01>CP</MAN01>
<MAN02>465467995515</MAN02>
</ns0:MAN>
</ns0:HLLoop1>
</ns0:X12_00401_856>
我将使用它 XSLT,像这样:
<LineItemCarrierTrackingNum>
<xsl:variable name="currentHL02" select="HL02" />
<xsl:value-of select="concat("//*[local-name()='HLLoop1'][.//*[HL03='O'] and ..//*[HL01='", $currentHL02,"']]//*MAN02"; />
</LineItemCarrierTrackingNum>
我希望我可以将 XPath 构建为变量,如上所示...
【问题讨论】: