gpt4 book ai didi

xml - XSLT 处理器如何找到匹配的模板?

转载 作者:数据小太阳 更新时间:2023-10-29 02:26:29 25 4
gpt4 key购买 nike

例如,考虑以下 XML:

<root>
<level1>
<!--S-->
<level2>bingo!</level2>
</level1>
</root>

假设我们有两个模板:match="level2"match="level1/level2"

当解析器到达level2节点时,它如何确定当前节点与两个模板匹配,并且必须选择第二个模板,因为它更具体? “更具体”模板的正式定义是什么?

最佳答案

我同意 FiveO 的观点,这是一个 duplicate question ,但话又说回来,你还问规范 foo 之间有什么区别?和 bar/foo以及选择了哪一个。

基本上,除非您在 xsl:template 上指定优先级声明,事物匹配的顺序由5.5 Conflict Resolution for Template Rules中的规则决定。对于 XSLT 1.0,6.4 Conflict Resolution for Template Rules对于 XSLT 2.0 和 6.4 Conflict Resolution for Template Rules .这些是您要求的正式定义

然而,基本规则非常简单:匹配越具体,优先级越高。除了多个谓词或更深路径之间的优先级没有区别。

如果两个具有相同优先级的模板匹配,在 XSLT 1.0 和 2.0 中,处理器可以恢复(采用声明顺序中的最后一个)或发出错误信号。在 3.0 中,您可以使用 <xsl:mode on-multiple-match="xxx" /> 设置此行为声明。 .

NodeTest(即您的 match="level2" )获得默认优先级 -0.5如果它有一个子轴说明符(这是你的 match="level1/level2" )它获得默认优先级 0 .高优先级优先,这就是为什么 bar/foo将匹配 foo ,前提是它有父级 bar .否则它将匹配 foo .

这些规则的基础知识在 XSLT 版本之间没有改变,它们只是被扩展以允许指定新的允许语法。

更多信息在 linked question 中.

更新,基于评论:
你问这是如何实现的。我只能代言 our XSLT 3.0 processor, Exselt , 并用一般的方式解释它,因为由于许多细微之处和优化,实际过程相当复杂。

  • 处理从具有初始模式的初始上下文节点开始
  • 处理器保留所有模式的散列并将所有联合拆分为单独的匹配模板
  • 每个模式都有一个按优先级排序的模式列表
  • 访问一个节点(此处为初始上下文节点)后,处理器遍历所有模式并找到第一个匹配的模式
  • 它通过向后比较路径来做到这一点(类似于规范中的解释),如下所示:** 节点的路径称为注释** 最右边的子轴步骤被采用并根据其 NameTest 匹配到当前节点或 KindTest (请参阅 XPath 规范中的这些产品)** 只有匹配,才匹配下一个(左边)子轴步,以此类推** 如果完整路径匹配,则谓词(如果有的话)针对当前节点进行评估,这是稍后完成的,因为这是一个更复杂的过程,可能需要处理器从当前节点移开,这是相对昂贵的。
  • 如果全部匹配,则执行匹配的模板,当前节点设置为模板的上下文节点。

关于xml - XSLT 处理器如何找到匹配的模板?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25010170/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com