xsltproc是linux/macos下最轻量可控的html表格生成方式,需确保xml结构规范、xsl首行声明编码、命令顺序为xsltproc style.xsl data.xml > output.html,并正确设置xsl:output method="html"等参数。

用 xsltproc 命令行快速生成 HTML 表格
Linux/macOS 下最轻量、最可控的方式就是用系统自带的 xsltproc,不用装浏览器、不依赖 JS,一条命令跑完就出 HTML 文件。
常见错误是直接双击 XSL 文件——那只是被浏览器当 XML 打开,根本不会执行转换;或者误以为 XSLT 能像 CSS 一样“挂载”到 XML 上自动生效,其实它必须显式调用处理器。
- 确保 XML 有明确根节点和结构化子元素(比如
<item><name>A</name><price>10</price></item>),XSLT 才好匹配 - XSL 文件第一行必须是
<?xml version="1.0" encoding="UTF-8"?>,否则xsltproc会报failed to parse - 执行命令:
xsltproc style.xsl data.xml > output.html,注意顺序:XSL 在前,XML 在后
<for-each></for-each> 和 <apply-templates></apply-templates> 到底选哪个
初学者容易卡在这儿:都用来遍历,但语义和可维护性差很远。<for-each></for-each> 是命令式写法,适合简单扁平列表;<apply-templates></apply-templates> 是声明式,靠 match 规则驱动,更适合嵌套或需复用模板的场景。
比如 XML 里有 <product></product> 和 <category></category> 两类节点,用 <apply-templates></apply-templates> 可分别定义 match="product" 和 match="category" 模板;而 <for-each select="product"></for-each> 只能硬编码处理逻辑,加个新类型就得改循环体。
立即学习“前端免费学习笔记(深入)”;
- 表格主体用
<for-each select="/root/item"></for-each>完全没问题,简洁直接 - 如果 XML 含混合内容(如注释、文本节点、属性),
<apply-templates></apply-templates>更安全,它默认忽略空白文本节点,<for-each></for-each>可能意外匹配到空字符串 - 性能上无实质差异,别为“看起来高级”强行套
apply-templates
表格列对不齐?检查 <value-of></value-of> 的 select 路径是否带多余斜杠
典型现象:HTML 表格某列全空,或所有单元格显示同一个值。大概率是 XPath 写错了,尤其是路径开头多了一个 /,导致从文档根开始绝对匹配,而不是相对当前上下文。
假设当前在 <for-each select="item"></for-each> 里,想取每个 item 的 price:<value-of select="price"></value-of> 正确;<value-of select="/item/price"></value-of> 就会失败——因为 /item 表示整个 XML 的根下找 item,而当前上下文已是某个 item 节点。
- 调试技巧:临时换成
<value-of select="name()"></value-of>看当前节点名,确认上下文是否符合预期 - 属性要用
@前缀,比如<value-of select="@id"></value-of>,漏掉@就取不到 - 含命名空间的 XML 必须在 XSL 中声明前缀并使用,否则
select="ns:price"会静默失败
中文乱码、样式丢失?XSLT 输出设置和 HTML 基础结构不能省
xsltproc 默认输出 XML 格式,直接写进 .html 文件会导致浏览器解析异常——比如中文变问号、<table> 标签没闭合、缺少 <code> 外壳。
必须在 XSL 文件的 <output></output> 里明确指定:method="html"、encoding="UTF-8"、indent="yes",否则即使源文件是 UTF-8,输出也可能被当 ISO-8859-1 处理。
- HTML 骨架要手写:XSLT 不会自动补
<meta charset="UTF-8">,这些得写在<template match="/"></template>里 - 避免用
<text></text>拼接标签,容易漏斜杠或引号,直接写<tr><td><value-of select="name"></value-of></td></tr> - Chrome 对 XSLT 生成的 HTML 兼容性较好,但 Safari 16+ 会禁用本地文件的 XSLT 处理,务必用
xsltproc或 HTTP 服务打开
xsltproc --novalid style.xsl data.xml 看报错,再逐层确认路径和编码。











