innermost()函数筛选出节点集合中非其他节点祖先的最深层节点,用于精准定位层级结构中的最细粒度元素,常见于Saxon等扩展XPath环境,非标准函数故不普遍;其逻辑可通过谓词如$nodes[not(some $desc in $nodes satisfies . >> $desc)]模拟,与outermost()相反,适用于提取不包含同类子节点的数据末梢。

innermost()
innermost()
举个例子,假设我们有这样的XML结构:
<root>
<section id="s1">
<item id="i1">
<detail id="d1">Content A</detail>
</item>
<item id="i2">
<detail id="d2">Content B</detail>
</item>
</section>
<section id="s2">
<item id="i3"/>
</section>
</root>如果我们执行一个XPath表达式,比如
//section | //item | //detail
section
item
detail
innermost()
<detail id="d1">
<detail id="d2">
<item id="i3"/>
i3
item
detail
section
item
item id="i1"
item id="i2"
detail
这个函数特别适合当你有一个包含多层嵌套同名元素的结果集,而你只想获取最底层、最具体的那些实例时。它能有效地帮你剥离掉那些仅仅作为容器存在的节点,直达数据核心。
innermost()
说实话,这确实是一个好问题。如果你翻阅XPath 1.0、2.0甚至3.0的官方规范,你可能不会在核心函数库中找到
innermost()
那么,它从何而来呢?通常,
innermost()
outermost()
fn:innermost()
fn:outermost()
这意味着,如果你在一个不支持这些扩展的XPath环境中使用它,比如在浏览器原生的
document.evaluate()
innermost()
outermost()
innermost()
outermost()
innermost()
outermost()
我们再来看那个XML例子:
<root>
<section id="s1">
<item id="i1">
<detail id="d1">Content A</detail>
</item>
<item id="i2">
<detail id="d2">Content B</detail>
</item>
</section>
<section id="s2">
<item id="i3"/>
</section>
</root>如果我们的初始节点集仍然是
//section | //item | //detail
innermost()
<detail id="d1">
<detail id="d2">
<item id="i3"/>
item
detail
outermost()
<section id="s1">
<section id="s2">
section
选择哪个函数,完全取决于你想要从多层嵌套结构中提取什么样粒度的数据。
innermost()
outermost()
innermost()
既然
innermost()
最直接的思路是利用谓词(predicate)来过滤节点。
innermost()
一种常见且相对通用的方法是,首先选择一个宽泛的节点集合,然后在这个集合中,排除那些拥有“后代节点且该后代节点也在初始集合中”的节点。
假设我们想要从所有
//element
element
//element[not(descendant::element)]
这个表达式会选择所有名为
element
element
但如果我们的目标是像
innermost()
//section | //item | //detail
innermost
(//section | //item | //detail)[
not(.//section | .//item | .//detail) or
(
not(self::section) and not(self::item) and not(self::detail)
)
]这个表达式有点笨重,因为它需要显式列出所有可能的后代类型。
一个更优雅且更接近
innermost()
对于像
fn:innermost(expression)
filter
$nodes := (//section | //item | //detail)
fn:innermost($nodes)
$nodes[not(some $desc in $nodes satisfies . >> $desc)]
这里
>>
$desc
$nodes
$desc
$nodes
innermost()
这种方法虽然比直接调用
innermost()
以上就是XPath的innermost()函数选择什么节点?的详细内容,更多请关注php中文网其它相关文章!
每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号