XSLT模板匹配优先级由显式priority属性或match表达式特异性自动决定,数值越大或模式越具体(如带谓词、多步路径)优先级越高,且显式设置恒覆盖默认值。

XSLT中的模式匹配优先级,决定当多个 都能匹配同一个节点时,哪个模板会被实际选用。它不是靠书写顺序,而是由一套明确的规则自动计算得出——既支持显式指定,也提供默认值。
显式 priority 属性最直接
你可以在模板中直接写 `priority="1"` 或 `priority="-0.7"`: - 数值越大,优先级越高 - 显式设置的值总会覆盖默认值(哪怕只设 `priority="0.1"`,也比多数默认值高) - 适合解决冲突场景,比如想强制某个模板优先生效默认优先级按匹配表达式的“特异性”自动分配
XSLT处理器会根据 `match` 属性里的XPath模式结构,自动打分,范围是 -0.5 到 +0.5: - `*`、`text()`、`attribute()` → 默认 -0.5 - `tv:*`(带命名空间通配)、`*:Name`(本地名通配)→ 默认 -0.25 - `book`、`@id`、`element(*, xs:date)`(仅名称或仅类型)→ 默认 0 - `element(book, xs:string)`(名称+类型)、`schema-element(Invoice)` → 默认 0.25 - `book[1]`、`book/title`、`description//channel`(含谓词或多个步)→ 默认 0.5简单说:越具体、越深入、约束越多的 match 表达式,自动得分越高。
优先级比较有前提条件
- 只有 `match` 属性存在的模板才参与默认优先级计算;带 `name` 但无 `match` 的模板不参与匹配竞争 - `xsl:import` 导入的模板默认被排除在优先级比较之外(除非显式设 priority) - 如果两个模板默认分相同,XSLT规范不保证执行顺序——这时必须用 `priority` 明确区分常见误区提醒
- 不要依赖模板在文件里的先后位置——XSLT不认“先写后写” - `match="/"` 和 `match="book"` 同时存在时,`book` 节点一定走 `match="book"` 模板,因为 `/` 匹配根,不匹配 `book` 子节点(这是匹配范围问题,不是优先级问题) - 空格、换行、注释不影响优先级计算基本上就这些。不复杂但容易忽略细节。










