XPath follow-sibling表达式似乎返回子文本而不是follow-sibling节点

时间:2013-04-22 21:53:37

标签: xml xpath

我正在尝试构建一个用于评估XML代码的xpath表达式,然后仅在当前段落后跟编号列表时才匹配。

这是我的XML:

<para><b>Some text</b></para>
<numlist>
  <numlitem><para>List item #1</para></numlitem>
  <numlitem><para>List item #2</para></numlitem>
  <numlitem><para>List item #3</para></numlitem>
</numlitem>

我使用的xpath表达式是:

para[following-sibling::*[1]=numlist]

然而,这并不是真的。如果我评估以下xpath表达式

para[following-sibling::*[1]

结果是“一些文字”。然而,因为&lt; b&gt;是&lt; para&gt;的孩子,我不指望这些结果。

以下表达式返回true

para[following-sibling::numlist]

所以我知道它看到numlist是一个跟随兄弟,但我只希望它返回true如果&lt; numlist&gt;是继&lt; para&gt;之后的第一个兄弟。

我正在使用XML软件应用程序,该应用程序根据元素的特定上下文和条件应用样式,其中xpath可用于确定。我试图弄清楚问题是否与软件有关(我需要提交错误报告)或者我的xpath表达式是否有问题,我需要弄清楚正确的表达式是什么。

非常感谢任何帮助!

2 个答案:

答案 0 :(得分:1)

在当前上下文中评估元素名称,因此para[numlist]表示“与子numlist元素对齐”。同样地:

para[following-sibling::*[1]=numlist]

表示“para,其第一个following-sibling::*具有与任何子numlist”元素相同的字符串值。由于para没有numlist个孩子,所以这个谓词总是错误的。

相等性测试使用节点的字符串值,而不是节点标识或节点名称,因此[element=otherelement]几乎不是您想要使用的。

如果您需要详细信息,请阅读XPath spec中有关布尔表达式的这些段落。这里重要的是:

  

如果要比较的两个对象都是节点集,那么当且仅当第一个节点集中有一个节点而第二个节点集中有一个节点时才进行比较,以便执行两个节点的字符串值的比较是真的。

你的真正含义是以下兄弟元素的名称是'numlist':

para[name(following-sibling::*[1])='numlist']

或者:

para[following-sibling::*[1]/self::numlist]

答案 1 :(得分:0)

1)你的xml示例格式不正确。

2)尝试这个xpath表达式:

para/following-sibling::*[1][self::numlist]

上面的表达式只匹配节点,如果你想要一个布尔结果,你需要boolean()函数:

boolean(para/following-sibling::*[1][self::numlist])