在Microsoft Office Word 2003的Word处理标记语言(WordML)中,以下两个XPath表达式之间是否有任何区别:
@".//w:p[count(*/w:t) >= 0]"
和
@".//w:p"
我很困惑,因为如果计数为零,那么表达式在尖括号中的重要性是什么?两者都不选择相同数量的节点吗?
另外,* / w:t只选择孙子还是会考虑直系孩子呢?
答案 0 :(得分:2)
这个表达式:
".//w:p[count(*/w:t) >= 0]"
选择上下文节点的所有后代(.
,无论它处于当前处理状态),如果它们是具有限定名称w:p
的元素,并且仅当它们的子节点(很可能是{{ 1}}元素)至少有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
的孙子的w:p
个元素。此外,在OOXML模式中不允许这个(即w:t
作为w:p
的直接子项)。
答案 1 :(得分:0)
你是对的,谓词[count(X)> = 0]总是正确的,因此可以安全地消除。