Rob*_*ney 20
jarnbjo指出了使用它的直观方式//*[not(ancestor::X)].无论文档的结构如何,它都具有非常大的优点,并且它是您在大多数情况下应该使用的.
但是如果你有一个非常大的文档,它可能是非常低效的.这是一个非常昂贵的查询.它告诉XPath处理器访问文档中的每个节点并检查其祖先节点是否存在名为X的元素.虽然XPath处理器可能足够聪明,知道它不需要访问X的后代为了评估该查询,它不太可能.
如果您有关于X元素的位置的一些信息,并且您要小心,那么您可以编写更有效的查询.例如,如果X是顶级元素的子元素,并且它有很多后代,那么这将更快:
/* | /*/* | /*/*[not(name()='X')]//*
Run Code Online (Sandbox Code Playgroud)
它找到了顶级元素,它的所有直接子元素,以及任何未命名为X的直接子元素的后代.它不会检查X的任何后代.
同样,如果您知道X接近树的底部,则此查询可能更有效:
//*[not(ancestor::*[position() <= 3][X])]
Run Code Online (Sandbox Code Playgroud)
因为它不会检查它测试的每个节点的整个祖先轴,只检查它的最后三个元素.(除非XPath处理器足够愚蠢,以便在执行position()可能使用的测试时检查轴上的每个节点.)
正如我所说的那样,大部分时间最简单的版本都是最好的,而且大部分时间都是我自己使用的版本.
| 归档时间: |
|
| 查看次数: |
16460 次 |
| 最近记录: |