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
(请参阅XPath规范中这些步骤的结果),执行最右边的子轴步骤并将其与当前节点匹配 **仅当匹配时,才匹配下一个(左侧)子轴步长,依此类推 **如果完整路径匹配,则谓词(如果有)将针对当前节点进行计算,这将在以后进行,因为这是一个更复杂的过程,可能需要处理器从当前节点移开,这相对成本较高KindTest
- 如果所有匹配,则执行匹配的模板,并将当前节点设置为模板的上下文节点