【发布时间】:2026-01-14 06:45:01
【问题描述】:
我有一个关于在 XPATH 中调用“父”轴的 XSLT 的性能问题。 我可以使用“::*”来调用父轴,也可以使用“::”和元素名称来调用它
parent::*/MVKE/item/VMSTA='Z2'
或
parent::item/MVKE/item/VMSTA='Z2'
如果我使用“*”或使用节点元素的名称,这对性能有影响吗?两者都有效,但我想知道有什么区别。
【问题讨论】:
我有一个关于在 XPATH 中调用“父”轴的 XSLT 的性能问题。 我可以使用“::*”来调用父轴,也可以使用“::”和元素名称来调用它
parent::*/MVKE/item/VMSTA='Z2'
或
parent::item/MVKE/item/VMSTA='Z2'
如果我使用“*”或使用节点元素的名称,这对性能有影响吗?两者都有效,但我想知道有什么区别。
【问题讨论】:
不一样,但我怀疑会有显着的性能差异。
使用*accepts 任何父元素,使用名称将要求父元素具有此名称,否则您将获得一个空节点集。因此,如果一个更快,它可能是* 一个。
另一种选择是使用parent::node(),或其缩写形式..
【讨论】:
第一个表达式匹配 any 元素父级。第二个表达式仅在父元素是 item 元素时匹配。这是唯一的区别。我无法想象任何显着的性能影响,因为两个节点测试都可以在恒定时间内执行。
注意XPath 1.0 spec中的这一行:
除根节点之外的每个节点都只有一个父节点,即 元素节点或根节点。
实际上,这意味着parent::* 匹配 任何 父元素,但根元素除外。
为了演示,考虑这个简单的示例文档:
<root>
<one/>
<item>
<two/>
</item>
</root>
然后:
//parent::* 将为您提供root 和item 元素(作为元素的每个父节点)
//parent::item 将仅返回 item 元素(唯一的父元素是 item)
//parent::node() 将为您获取root 的父节点(即根节点)以及root 和item 元素
【讨论】:
简单地说:
<xsl:value-of select="../node()"/>
给你直接的父母。有没有一种方法和另一种方法中的原始问题性能优势?
【讨论】: