例如,请考虑以下XML:
<root>
<level1>
<!--S-->
<level2>bingo!</level2>
</level1>
</root>
并假设我们有两个模板:match="level2"
和match="level1/level2"
。
当解析器到达level2
节点时,它究竟是如何确定当前节点与两个模板匹配的,并且它必须选择第二个模板,因为它更具体?什么是&#34;更具体的&#34;的正式定义?模板?
答案 0 :(得分:4)
我同意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规范中的这些节目)
**只有匹配时,才会匹配下一个(左侧)子轴步骤,依此类推
**如果完整路径匹配,则谓词(如果有)针对当前节点进行评估,这将在稍后完成,因为它是一个更复杂的过程并且可能要求处理器离开当前节点,这相对昂贵。