我正在尝试编写一个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]"/>
- 返回仅在父级别上匹配以下兄弟的第一个匹配,即示例中没有任何内容。
如何在必要时遍历树并仅捕获第一个匹配?
对于你的第一个表达,你需要在这个写...
<xsl:apply-templates select="(ancestor::*/following-sibling::*[@href])[1]"/>
但也许你最好使用following
轴,而不是following-sibling
,那么你可以这样做...
<xsl:apply-templates select="following::*[@href][1]"/>