xml - 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
?
解决方案
这个 XPath,
//Literal[not(ancestor::ArgumentList)]
将选择Literal
没有ArgumentList
祖先的元素,
<Literal Image="10"/>
但不是
<Literal Image="15"/>
按照要求。
推荐阅读
- azure - 如何获取collectionLink azure cosmodb
- html - 修复 asp.net 中的背景 div
- webpack - webpack SASS 捆绑并创建多个文件
- html - 使用 UIKIT 创建网格布局
- c++ - 为什么从 char 转换为 std::byte 可能是未定义的行为?
- javascript - 如何解决heroku中的这个应用程序启动错误?
- python - 如何从 doxygen 中排除 python 代码中的某些方法?
- html - CSS 格式化表格行列宽
- swift - NSCopy GKGameModel 不能正确复制玩家对象
- java - java - Selenium Chromedriver 无法通过 LinkText 找到元素,但 Geckodriver 可以