模板是XSLT中定义XML节点转换规则的处理单元,通过match属性使用XPath匹配节点,处理器按优先级选择最具体的模板执行,显式模板覆盖默认行为,结合xsl:apply-templates实现递归处理,形成声明式转换流程。

XSLT中的模板(template)是一段用于定义“当遇到特定XML节点时,该如何转换或输出”的规则。它不是自动执行的函数,而是由XSLT处理器根据匹配条件主动调用的处理单元。
模板通过match属性声明匹配目标
match 属性是模板的核心,它使用XPath表达式指定该模板适用于哪些XML节点。匹配不依赖位置或顺序,只看节点是否满足XPath条件。
-
匹配所有名为book的元素节点(无论嵌套多深) -
只匹配根元素catalog下第一个book子元素 -
匹配所有名为id的属性节点 -
匹配所有文本节点(常用于精细控制空白或内容提取)
匹配过程是自顶向下、优先级驱动的
XSLT处理器对每个节点尝试找到最具体的匹配模板。当多个模板都能匹配时,按“静态优先级”决定谁生效——通常更精确的XPath有更高优先级。
-
match="book/title"比match="title"更具体,优先被选中 -
match="book[@category='fiction']"比match="book"优先级高(带谓词的更具体) - 没写
match的模板(如仅用name)不会自动触发,需显式用调用
默认模板与显式模板共同构成处理链
即使没写任何模板,XSLT也有内置默认规则:对元素节点默认递归处理子节点;对文本节点默认原样输出。一旦你写了匹配同一类节点的模板,就覆盖了默认行为。
- 想让所有
price元素显示为“¥{值}”,就写¥ - 若没为
author写模板,它会走默认规则——继续处理其子节点(比如里面的名字文本) - 用
触发子节点匹配,形成递归处理流
基本上就这些。模板的本质是“声明式路由”:你声明“这类节点该这么变”,XSLT引擎负责在遍历XML树时自动分发和执行。










