XSLT模板(template)和应用模板(apply-templates)怎么用

xsl:template定义处理规则,xsl:apply-templates调度执行节点;前者通过match匹配并声明输出逻辑,后者通过select、mode等控制处理范围与方式,二者协同构成XSLT核心驱动机制

xsl:template 定义“怎么处理某类节点”,xsl:apply-templates 决定“现在去处理哪些节点”——两者配合,构成 XSLT 的核心驱动逻辑。

模板(xsl:template)是规则说明书

它声明:当遇到匹配的节点时,该输出什么、怎么计算、是否递归处理子节点。

  • 必须有 match 属性(除非用 name 做命名模板),比如 match="book"match="/"
  • match 值是 XPath 表达式,处理器靠它判断“这个模板管不管用”
  • 模板内可写 HTML、文本、函数(如 ),也可嵌套 继续向下处理
  • 多个模板可能同时匹配一个节点,XSLT 按优先级(priority)或声明顺序(后声明胜出)选一个执行

应用模板(xsl:apply-templates)是调度员

它不自己输出内容,而是告诉处理器:“请按规则,去处理我挑出来的这些节点”。

  • 不写 select 时,默认处理当前节点的所有直接子节点
  • 写了 select="chapter",就只处理 子元素;写 select="*" 就处理所有子元素(不含文本节点)
  • mode="summary",就只触发带 mode="summary" 的模板,实现同一节点多种输出方式
  • 内部可嵌 控制顺序,或 向目标模板传参

典型配合流程

以 XML 中 XML入门 基础 为例:

  • 主模板 match="/" 输出 ,然后
  • 触发 match="book" 模板:输出

    ,再用 (无 select)处理它的子节点
  • 遇到 ,匹配 match="title" 模板,输出文字;遇到 ,匹配 match="chapter" 模板,输出编号和标题

容易忽略的关键点

  • 不等于 “复制子节点内容”——它会重新走匹配流程,没写对应模板的节点可能被跳过或走内置规则
  • 没写 的模板,其子节点默认不处理(除非用了 这类直接取值指令)
  • mode 不是可有可无的修饰,它是隔离不同处理逻辑的必要手段,尤其在 import/override 场景中
  • select 表达式运行在当前上下文节点下,不是整个文档根,这点和 类似但语义不同
基本上就这些。写模板像写条件分支,调用模板像发任务单——理清谁定义规则、谁触发执行,XSLT 就不难上手。