1

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

这是我的 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]

但是,这不会返回 true。如果我评估以下 xpath 表达式

para[following-sibling::*[1]

结果是“一些文字”。然而,由于 <b> 是 <para> 的孩子,我不希望这些结果。

以下表达式返回 true

para[following-sibling::numlist]

所以我知道它将 numlist 视为后续兄弟,但我只希望它在 <numlist> 是 <para> 之后的第一个兄弟时返回 true。

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

任何帮助是极大的赞赏!

4

2 回答 2

1

元素名称是在当前上下文中评估的,因此para[numlist]意味着“带有子numlist元素的 para”。同样地:

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

表示"para其第一个following-sibling::*具有与任何子numlist" 元素相同的字符串值。因为 para 没有numlist孩子,所以这个谓词总是假的。

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

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

如果要比较的两个对象都是节点集,那么当且仅当在第一个节点集中有一个节点并且在第二个节点集中有一个节点使得对两个节点的字符串值都为真。

您真正的意思是以下兄弟元素的名称是“numlist”:

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

或者:

para[following-sibling::*[1]/self::numlist]
于 2013-04-22T22:17:22.047 回答
0

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

2) 试试这个 xpath 表达式:

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

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

boolean(para/following-sibling::*[1][self::numlist])
于 2013-04-22T22:16:16.967 回答