【问题标题】:XPATH/XSLT - matching only the first following ancestor with a given attributeXPATH/XSLT - 仅匹配具有给定属性的第一个后续祖先
【发布时间】:2019-02-11 22:33:17
【问题描述】:

我正在尝试编写一个 xpath 表达式来匹配 包含给定属性的第一个后续祖先,但我找不到合适的 xpath。一个简化的 XML 示例:

<root>
  <node href="L1_value_1">
    <node href="L2_value_1">
      <node href="L3_value_1">
        <node href="L4_value_1"/>
      </node>
    </node>
    <node/>
    <node href="L2_value_2"/>
    <node href="L2_value_3"/>
  </node>
  <node href="L1_value_2"/>
  <node href="L1_value_3"/>
</root>

例如,如果我在包含 href="L4_value_1" 的节点上,我只想返回具有 href="L2_value_2" 的节点。不幸的是,我找不到正确的 xpath。我尝试了以下方法:

<xsl:apply-templates select="ancestor::*/following-sibling::*[@href][1]"/>

--返回每个祖先级别的第一个匹配的后续兄弟,即示例中包含L2_value_2和L1_value_2的节点。

<xsl:apply-templates select="ancestor::*[1]/following-sibling::*[@href][1]"/>

--在父级别返回第一个匹配的后续兄弟,即示例中没有任何内容。

我怎样才能尽可能地向上遍历树并且捕获第一个匹配项?

【问题讨论】:

  • 如果ancestor::*/following-sibling::*[@href][1] 为您提供所有元素,那么(ancestor::*/following-sibling::*[@href][1])[1] 为您提供文档顺序中的第一个元素。不确定这是否就是您所需要的。

标签: xslt xpath


【解决方案1】:

对于您的第一个表达式,您需要将其写在此处...

 <xsl:apply-templates select="(ancestor::*/following-sibling::*[@href])[1]"/>

但也许你最好使用following 轴,而不是following-sibling,那么你可以这样做......

<xsl:apply-templates select="following::*[@href][1]"/>

【讨论】:

  • 表达式following::X等价于ancestor::*/following-sibling::*/descendant-or-self::X,与ancestor::*/following-sibling::X不一样,因为它既选择表亲,也选择叔叔;要求的表述不够清楚,无法知道哪个是正确的。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2022-11-23
  • 1970-01-01
  • 2015-02-06
  • 1970-01-01
  • 2011-02-21
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多