XSLT处理器如何找到匹配的模板? 例如,考虑以下XML: <root> <level1> <!--S--> <level2>bingo!</level2> </level1> </root> 答对 了

XSLT处理器如何找到匹配的模板? 例如,考虑以下XML: <root> <level1> <!--S--> <level2>bingo!</level2> </level1> </root> 答对 了,xml,xslt,Xml,Xslt,假设我们有两个模板:match=“level2”和match=“level1/level2” 当解析器到达level2节点时,它如何准确地确定当前节点与两个模板匹配,以及它必须选择第二个模板,因为它更具体?“更具体”模板的正式定义是什么?我同意FiveO的说法,即这是一个规范,但您也会问规范foo和bar/foo之间有什么区别,以及选择了哪一个 本质上,除非在xsl:template声明中指定优先级,否则匹配顺序由XSLT1.0、XSLT2.0和中的规则确定。这些是您要求的正式定义 但是,基本规

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


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

我同意FiveO的说法,即这是一个规范,但您也会问规范
foo
bar/foo
之间有什么区别,以及选择了哪一个

本质上,除非在
xsl:template
声明中指定优先级,否则匹配顺序由XSLT1.0、XSLT2.0和中的规则确定。这些是您要求的正式定义

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

如果两个具有相同优先级的模板匹配,在XSLT1.0和2.0中,处理器可以恢复(按照声明顺序使用最后一个模板)或发出错误信号。在3.0中,可以使用
将此行为设置为声明性

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

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

更多信息请参阅

根据评论更新:
你会问这是如何实现的。我只能说,并解释它在一般的行,因为实际的过程是相当复杂的,因为许多微妙的和优化

  • 处理从具有初始模式的初始上下文节点开始
  • 处理器保留所有模式的散列,并将所有联合拆分为单独的匹配模板
  • 每个模式都有一个按优先级排序的模式列表
  • 在访问一个节点(这里是初始上下文节点)时,处理器会检查所有模式并找到第一个匹配的模式
  • 它通过向后比较路径来实现这一点(类似于规范中的解释),如下所示: **节点的路径称为注释 **根据当前节点的
    NameTest
    KindTest
    (请参阅XPath规范中这些步骤的结果),执行最右边的子轴步骤并将其与当前节点匹配 **仅当匹配时,才匹配下一个(左侧)子轴步长,依此类推 **如果完整路径匹配,则谓词(如果有)将针对当前节点进行计算,这将在以后进行,因为这是一个更复杂的过程,可能需要处理器从当前节点移开,这相对成本较高
  • 如果所有匹配,则执行匹配的模板,并将当前节点设置为模板的上下文节点

重复问题:顺便说一句,同样的原则也适用于CSS匹配表达式。在多条规则中,更具体的规则获胜,这些规则与上次宣布的规则具有相同的特异性。我的问题不是在找到一组匹配后如何确定优先级,而是如何进行这些匹配。我的意思是,我们有一个当前节点(上下文),我们有一组模板规则-我们(XSLT处理器)如何过滤它们以生成一组匹配规则?@DmitryRestov:我更新了它。事实上,有完整的论文是关于这一点的,很难在这个论坛的简短背景下解释,但希望你能得到大致的想法。