XSLT 函数速查手册(2025 终极版)
按真实使用频率排序,标明所属版本 + 一句话作用 + 必背示例
| 频率 | 函数名 | 版本 | 类型 | 一句话作用 | 必背示例 |
|---|---|---|---|---|---|
| 1 | current() | 1.0+ | 上下文 | 返回当前正在处理的节点(常用于复杂谓语) | key('k', current()/id) |
| 2 | document() | 1.0+ | 文件 | 加载外部 XML 文件(多文档合并神器) | document('config.xml') |
| 3 | format-number() | 1.0+ | 数字 | 数字格式化(千分位、两位小数) | format-number(12345.6, '#,##0.00') → 12,345.60 |
| 4 | contains() | 1.0+ | 字符串 | 判断是否包含子串 | contains(title, 'XSLT') |
| 5 | starts-with() | 1.0+ | 字符串 | 判断是否以某串开头 | starts-with(@id, 'b') |
| 6 | substring() | 1.0+ | 字符串 | 取子串 | substring(title, 1, 10) |
| 7 | string-length() | 1.0+ | 字符串 | 取字符串长度 | string-length(normalize-space(.)) = 0 |
| 8 | normalize-space() | 1.0+ | 字符串 | 去首尾空白、压缩中间空格(神级函数) | normalize-space(text()) |
| 9 | count() | 1.0+ | 节点集 | 统计节点数量 | count(//book) |
| 10 | position() / last() | 1.0+ | 上下文 | 在 for-each 中获取位置和总数(表格行号必备) | <xsl:number value="position()"/> |
| 11 | not() | 1.0+ | 布尔 | 取反 | not(@status) |
| 12 | ceiling() / floor() / round() | 1.0+ | 数学 | 取上限/下限/四舍五入 | round(price * 1.08) |
| 13 | translate() | 1.0+ | 字符串 | 字符替换(常用于去横线、转大小写) | translate(., '-', '') |
| 14 | concat() | 1.0+ | 字符串 | 字符串拼接 | concat('ISBN:', @isbn) |
| 15 | string() | 1.0+ | 类型转换 | 强制转字符串 | string(@price) |
| 16 | number() | 1.0+ | 类型转换 | 转数字(NaN 则返回 NaN) | number('123.45') |
| 17 | boolean() | 1.0+ | 类型转换 | 转布尔 | boolean(//book) |
| 18 | name() / local-name() / namespace-uri() | 1.0+ | 节点信息 | 获取节点名、局部名、命名空间 | name() |
| 19 | generate-id() | 1.0+ | ID | 生成唯一 ID(常用于 HTML anchor) | <a name="{generate-id()}"> |
| 20 | system-property() | 1.0+ | 系统 | 获取 XSLT 处理器信息 | system-property('xsl:vendor') |
| 21 | element-available() / function-available() | 1.0+ | 动态检测 | 判断元素或函数是否可用 | function-available('format-date') |
| 22 | unparsed-entity-uri() | 1.0+ | 实体 | 获取未解析实体的 URI | 极少用 |
| 23 | key() + <xsl:key> | 1.0+ | 索引 | 类似数据库索引,性能提升 100 倍 | key('book-by-id', @id) |
| 24 | format-date() / format-dateTime() / format-time() | 2.0+ | 日期 | 格式化日期(最常用日期函数) | format-date(current-date(), '[Y]-[M01]-[D01]') |
| 25 | current-date() / current-dateTime() / current-time() | 2.0+ | 日期 | 获取当前日期时间 | current-dateTime() |
| 26 | lower-case() / upper-case() | 2.0+ | 字符串 | 大小写转换(1.0 只能用 translate 模拟) | lower-case(title) |
| 27 | matches() / replace() / tokenize() | 2.0+ | 正则 | 正则匹配、替换、分词(神器级) | replace(phone, '\D', '') |
| 28 | xml-to-json() / json-to-xml() | 3.0+ | JSON | 原生 XML ↔ JSON 互转(2025 年最爽功能) | xml-to-json(.) |
| 29 | serialize() | 3.0+ | 序列化 | 把节点树重新序列化成字符串(控制缩进等) | serialize($node, map{'indent':true()}) |
| 30 | random-number-generator() | 3.0+ | 随机 | 生成随机数 | random-number-generator()?number |
| 31 | map:* / array:* 函数群 | 3.0+ | 高阶数据结构 | Map 和 Array 操作(函数式编程) | map:get($config, 'title') |
| 32 | trace() | 3.0+ | 调试 | 调试打印(比 message 更强) | trace($value, '当前价格:') |
2025 年必背 15 个函数组合(直接复制)
| 场景 | 代码(一行搞定) |
|---|---|
| 去掉所有非数字 | replace($str, '\D', '') |
| 价格加税 8.5% 并保留两位小数 | format-number(price * 1.085, '#,##0.00') |
| ISBN 去横线 | translate(@isbn, '-', '') |
| 判断节点是否存在 | exists(//error) |
| 取第一个匹配的节点 | (//book[@new])[1] |
| 今天日期(2025-11-26) | format-date(current-date(), '[Y0001]-[M01]-[D01]') |
| XML 转 JSON(最简) | xml-to-json(., map{'indent':true()}) |
| 去首尾空白并判断空 | normalize-space(.) = '' |
| 生成 HTML id 并锚点 | <h2 id="{generate-id()}"><xsl:value-of select="."/></h2> |
| 交叉引用(key 的经典用法) | <xsl:key name="b" match="book" use="@id"/><xsl:for-each select="//ref"><xsl:value-of select="key('b', .)/title"/></xsl:for-each> |
| 价格排序 | <xsl:perform-sort select="book"><xsl:sort select="xs:decimal(price)" order="descending"/></xsl:perform-sort> |
| 分割字符串成数组 | tokenize($csv-line, ',') |
| 动态 XPath(3.0) | <xsl:evaluate xpath="$path"/> |
| 随机排序(洗牌) | <xsl:perform-sort select="book"><xsl:sort select="random-number-generator()?number"/></xsl:perform-sort> |
| 合并多个 XML | collection('data/?select=*.xml') |
把这张表保存为 PDF 或打印出来贴墙上,你就拥有了 XSLT 函数的“降龙十八掌”。
需要我发你 Markdown / PDF / Excel 可打印版吗?立刻打包给你!