首页 > 解决方案 > XPath 优化以选择没有祖先的节点

问题描述

简单来说,我想编写一个 XPath 1.0 查询来选择10但不选择15. 15不应选择,因为它有一个祖先ArgumentList

这是 XML。

<IfStatement>
   <Expression>
      ...
         <PrimaryExpression>
            <PrimaryPrefix>
               <Literal Image="10"/>
            </PrimaryPrefix>
            <PrimarySuffix>
               <Arguments>
                  <ArgumentList>
                     <Expression>
                        ...
                           <PrimaryExpression>
                              <PrimaryPrefix>
                                 <Literal Image="15"/>
                              </PrimaryPrefix>
                           </PrimaryExpression>
                        ...
                     </Expression>
                  </ArgumentList>
               </Arguments>
            </PrimarySuffix>
         </PrimaryExpression>
      ...
   </Expression>
</IfStatement>

这是我正在使用的 XPath 查询...

(//IfStatement | //ForStatement | //WhileStatement)
/Expression
//*
/PrimaryExpression
/PrimaryPrefix
/Literal[not(ancestor::ArgumentList)]

是必需的,因为XML 中//*由 表示的层次结构中的节点数量未知。...

问题是这ancestor::ArgumentList是一个缓慢的操作。我想编写如下所示的 XPath 查询。

(//IfStatement | //ForStatement | //WhileStatement)
/Expression
//*[not(self::ArgumentList)]
/PrimaryExpression
/PrimaryPrefix
/Literal

问题是//*[not(self::ArgumentList)]不妨碍选择15

我应该放什么//*来防止选择15由于ArgumentList

标签: xmlxpathpmd

解决方案


这个 XPath,

//Literal[not(ancestor::ArgumentList)]

将选择Literal没有ArgumentList祖先的元素,

<Literal Image="10"/>

但不是

<Literal Image="15"/>

按照要求。


推荐阅读