在 Microsoft Office Word 2003 的文字处理标记语言 (WordML) 中,以下两个 XPath 表达式之间有什么区别:
@".//w:p[count(*/w:t) >= 0]"
和
@".//w:p"
我很困惑,因为如果计数为零,那么尖括号中的表达式的重要性是什么?不是都选择相同数量的节点吗?
另外, */w:t 是否只选择孙辈,还是会考虑直系子女?
这个表达式:
".//w:p[count(*/w:t) >= 0]"
如果上下文节点是具有限定名称的元素并且仅当它们的子节点(最可能的元素)至少有 0个元素时,则选择上下文节点的所有后代(.
无论它处于当前处理状态中的状态)。w:p
w:r
w: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:p
w:t
w:p
您是对的,谓词 [count(X) >= 0] 始终为真,因此可以安全地消除。