XSLT中的模板(template)是什么,它如何匹配XML中的节点?

模板是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树时自动分发和执行。