在Microsoft ADF中使用XPath提取PICKUP地址遇阻,求排查
ADF XPath表达式失效原因及解决方法
问题出在哪
- 你写的ADF表达式里
*[name()="AddressTypeCode"][text()="PICKUP"][name()="AddressLines"]逻辑完全错误:一个XML节点只能有一个名称,不可能同时叫AddressTypeCode和AddressLines,这相当于找不存在的节点,自然匹配不到任何内容。 - 层级关联逻辑混乱:正确逻辑是先找到包含
AddressTypeCode="PICKUP"的Address节点,再定位它下面的AddressLines/Value,你的表达式跳转层级时完全搞错了节点关系。
正确的ADF XPath表达式(提取首个PICKUP地址的第一个Value)
考虑到ADF对XML命名空间的处理要求,用name()匹配节点名来兼容,修正后的表达式如下:
string(//*[name()="Address"][*[name()="AddressTypeCode" and normalize-space(text())="PICKUP"]]/*[name()="AddressLines"]/*[name()="Value"][position()=1])
或者更贴近你原来在线工具的写法:
string(.//*[name()="Address"][normalize-space(*[name()="AddressTypeCode"])="PICKUP"]/*[name()="AddressLines"]/*[name()="Value"][1])
提取PICKUP地址的多实例内容
提取首个PICKUP地址的第1、2、3个Value
# 第一个Value string(//*[name()="Address"][*[name()="AddressTypeCode" and normalize-space(text())="PICKUP"]][1]/*[name()="AddressLines"]/*[name()="Value"][1]) # 第二个Value string(//*[name()="Address"][*[name()="AddressTypeCode" and normalize-space(text())="PICKUP"]][1]/*[name()="AddressLines"]/*[name()="Value"][2]) # 第三个Value string(//*[name()="Address"][*[name()="AddressTypeCode" and normalize-space(text())="PICKUP"]][1]/*[name()="AddressLines"]/*[name()="Value"][3])
提取前3个PICKUP地址的第一个Value
# 第一个PICKUP地址的第一个Value string(//*[name()="Address"][*[name()="AddressTypeCode" and normalize-space(text())="PICKUP"]][1]/*[name()="AddressLines"]/*[name()="Value"][1]) # 第二个PICKUP地址的第一个Value string(//*[name()="Address"][*[name()="AddressTypeCode" and normalize-space(text())="PICKUP"]][2]/*[name()="AddressLines"]/*[name()="Value"][1]) # 第三个PICKUP地址的第一个Value string(//*[name()="Address"][*[name()="AddressTypeCode" and normalize-space(text())="PICKUP"]][3]/*[name()="AddressLines"]/*[name()="Value"][1])
内容的提问来源于stack exchange,提问作者shAkur
相关产品推荐
相关产品推荐

