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

时间:2014-07-29 07:26:25

标签: xml xslt

例如,请考虑以下XML:

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

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

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

1 个答案:

答案 0 :(得分:4)

我同意FiveO这是duplicate question,但同样,您还要求说明foobar/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,并在一般情况下解释它,因为实际过程因为许多细微之处和优化而相当复杂。

  • 处理从具有初始模式的初始上下文节点开始
  • 处理器保留所有模式的哈希,并将所有联合分成单独的匹配模板
  • 每种模式都有按优先级排序的模式列表
  • 在访问节点(此处为初始上下文节点)时,处理器会检查所有模式并找到匹配的第一个
  • 它通过向后比较路径(类似于规范中解释的方式)来完成此操作,如下所示: **节点的路径称为注释 **最右边的子轴步骤取决于当前节点的NameTestKindTest(参见XPath规范中的这些节目) **只有匹配时,才会匹配下一个(左侧)子轴步骤,依此类推 **如果完整路径匹配,则谓词(如果有)针对当前节点进行评估,这将在稍后完成,因为它是一个更复杂的过程并且可能要求处理器离开当前节点,这相对昂贵。
  • 如果匹配,则匹配的模板将在当前节点设置为模板的上下文节点的情况下执行。