【问题标题】:Xpath subscript returning all nodes, not just the requested one [duplicate]Xpath下标返回所有节点,而不仅仅是请求的[重复]
【发布时间】: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 规范中有很多很好的例子,同意。

标签: xpath xslt-1.0


【解决方案1】:

只选择整个节点列表的第一个元素

(//*[local-name()='SN102'])[1]

如果有多个同名的兄弟姐妹,原始查询 //*[local-name()='SN102'][1] 会选择第一个 SN102。

【讨论】:

    猜你喜欢
    • 2018-04-29
    • 1970-01-01
    • 2018-04-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-10-07
    • 2013-11-30
    相关资源
    最近更新 更多