【发布时间】:2019-09-22 09:12:48
【问题描述】:
我正在尝试以下 XPath:
//*[local-name()='SN102'][1]
使用 XPathTester,我保存了我的场景 http://www.xpathtester.com/xpath/94ee37e08960247a7bf0619d38c52bee
并非每个 HL1Loop 都有 SN102。
否则,我可以这样做:
//*[local-name()='HLLoop1'][1]//*[local-name()='SN102']
我已将示例数据简化为以下内容:
<ns0:X12_00401_856 xmlns:ns0="http://schemas.microsoft.com/BizTalk/EDI/X12/2006">
<ns0:HLLoop1>
<ns0:SN1>
<SN102>1</SN102>
<SN103>EA</SN103>
<SN108>AC</SN108>
</ns0:SN1>
</ns0:HLLoop1>
<ns0:HLLoop1>
<ns0:SN1>
<SN102>2</SN102>
<SN103>EA</SN103>
<SN108>AC</SN108>
</ns0:SN1>
</ns0:HLLoop1>
</ns0:X12_00401_856>
结果是返回所有节点,而不仅仅是第一个:
<?xml version="1.0" encoding="UTF-8"?>
<result>
<SN102>1</SN102>
<SN102>2</SN102>
</result>
如何只选择第一个节点。看起来很简单,我确信我以前做过,但今天没有工作。
我有一个“供应商模拟器”程序正在构建假 856 数据以发回,我想增加第一个数量只是为了强制执行一些错误处理逻辑。
【问题讨论】:
-
我很确定您的简化文档不能反映真实情况。您描述的行为只有在
HLLoop1元素是不同父级中的相应第一个此类元素时才会发生。 -
这是一个常见问题解答。
[]在 XPath 中的优先级高于//,这一事实误导了许多人。如果没有覆盖(),//a[1]将选择所有a元素,它们是其父元素的第一个子元素。有关详细信息和讨论,请参阅重复链接。 -
实际上,正确答案在 XPath 规范本身的注释中:w3.org/TR/1999/REC-xpath-19991116/#path-abbrev
-
@michael.hor257k:在原始的简单 XPath 规范中有很多很好的例子,同意。