Word处理标记语言中这些XPath表达式之间的区别?

时间:2014-04-02 14:29:11

标签: .net xpath wordml

在Microsoft Office Word 2003的Word处理标记语言(WordML)中,以下两个XPath表达式之间是否有任何区别:

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

@".//w:p"

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

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

2 个答案:

答案 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]总是正确的,因此可以安全地消除。