0

在 Microsoft Office Word 2003 的文字处理标记语言 (WordML) 中,以下两个 XPath 表达式之间有什么区别:

@".//w:p[count(*/w:t) >= 0]"

@".//w:p"

我很困惑,因为如果计数为零,那么尖括号中的表达式的重要性是什么?不是都选择相同数量的节点吗?

另外, */w:t 是否只选择孙辈,还是会考虑直系子女?

4

2 回答 2

2

这个表达式:

".//w:p[count(*/w:t) >= 0]"

如果上下文节点是具有限定名称的元素并且仅当它们的子节点(最可能的元素)至少有 0个元素时,则选择上下文节点的所有后代(.无论它处于当前处理状态中的状态)。w:pw:rw:t

当然,这没有多大意义,但这会:

".//w:p[count(*/w:t) >= 1]"

但实际上,这就足够了:

".//w:p[descendant::w:t]"

它背后的基本原理是w:p仅当元素包含文本时才选择元素(存储在w:t元素中,而文本又存储在w:r元素中(“运行”)。


另一方面,

".//w:p"

选择w:p作为上下文节点后代的所有元素,无论它们是否包含w:t后代。


编辑

不是都选择相同数量的节点吗?

是的,两者的含义相同,但其中一个是明智的表达,而另一个则不是。

*/w:t 是否只选择孙辈,还是会考虑直系子女?

此表达式将仅考虑作为 的孙子w:t元素的元素。此外, OOXML Schema 中不允许这个(即作为 的直接子级)。w:pw:tw:p

于 2014-04-02T14:36:22.727 回答
0

您是对的,谓词 [count(X) >= 0] 始终为真,因此可以安全地消除。

于 2014-04-02T15:46:05.237 回答