有没有任何方法可以在Xpath 2.0中获取特定节点的任何类型的兄弟

时间:2012-11-01 05:50:40

标签: xpath xpath-2.0

是否有任何方法可以在Xpath 2.0中获取特定节点的任何类型的兄弟

轴“跟随兄弟”仅支持相同类型的兄弟姐妹。

例如:

<node>
<b name="bold">abc</b>
<div>gef</div>
</node>

我想选择<b name="bold">的所有兄弟。

2 个答案:

答案 0 :(得分:2)

Is there any method to get any type of sibling of a particular node in Xpath 2.0

The axes following-sibling only supports for the same type of siblings.

使用

following-sibling::node()

这将选择任何类型的所有兄弟节点 - 元素,文本节点,处理指令节点和注释节点。

以下是完整的基于XSLT的验证

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
 <xsl:output omit-xml-declaration="yes" indent="yes"/>

 <xsl:template match="/">
     <xsl:for-each select="/*/b[@name='bold']/following-sibling::node()">
      "<xsl:copy-of select="."/>"
     </xsl:for-each>
 </xsl:template>
</xsl:stylesheet>

在提供的XML文档上应用此转换时:

<node>
    <b name="bold">abc</b>
    <div>gef</div>
</node>

应用XPath表达式(关闭所需元素)并将所有选定的三个节点复制到输出

      "
    "

      "<div>gef</div>"

      "
"

正如我们所看到的,选择了所有兄弟节点 - 一个仅空白的文本节点,一个div元素和另一个仅空白的文本节点。

请注意:这是一个XPath 1.0表达式,我不相信XPath 2.0增加了选择兄弟的任何新功能,而不是XPath 1.0中已有的功能。< / p>

如果“sibling”意味着与XPath中“兄弟姐妹”的意思不同,那么你必须准确定义你的意思。

答案 1 :(得分:1)

我不确定我是否理解这个问题,但是如何:

//*[preceding-sibling::b]

这将获得<b name="bold">abc</b>元素的所有先前兄弟。 *选择任何类型的元素。

如果您想要所有兄弟姐妹:

//*[preceding-sibling::b or following-sibling::b]

如果您想更具体地选择b元素:

//*[preceding-sibling::b[@name="bold"]]