XPATH / XSLT - 仅匹配具有给定属性的第一个祖先

问题描述 投票:2回答:1

我正在尝试编写一个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]"/>

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

如何在必要时遍历树并仅捕获第一个匹配?

xslt xpath
1个回答
4
投票

对于你的第一个表达,你需要在这个写...

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

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

<xsl:apply-templates select="following::*[@href][1]"/>
© www.soinside.com 2019 - 2024. All rights reserved.