XPath的translate()函数是专门用于字符串字符替换的内置函数,它可以根据指定的字符映射关系对目标字符串进行替换或删除操作,在XML文档解析、XSLT样式转换等场景中应用十分广泛。

translate()函数的基本语法
translate()函数的完整语法格式如下:
translate(string, from_chars, to_chars)
三个参数的具体含义如下:
- string:需要进行字符替换的原始字符串,可以是XPath的字符串字面量,也可以是返回字符串的XPath表达式。
- from_chars:需要被替换的原始字符集合,是一个字符串,每个字符都会被单独作为替换对象。
- to_chars:替换后的目标字符集合,也是一个字符串,每个字符会和from_chars中的字符按顺序一一对应。
核心替换规则说明
1. 一对一顺序替换规则
from_chars和to_chars中的字符会按照位置顺序一一对应,from_chars中的第n个字符会被替换成to_chars中的第n个字符。比如from_chars是"ab",to_chars是"AB",那么原始字符串中所有的"a"都会被替换成"A",所有的"b"都会被替换成"B"。
下面是一段XML示例文档:
<bookstore>
<book>
<title>java编程思想</title>
</book>
<book>
<title>python数据分析</title>
</book>
</bookstore>
使用translate()函数将标题中的小写字母替换为大写字母的XPath表达式和结果如下:
//title/text()[translate(., 'java', 'JAVA')]
第一个title的处理结果为"JAVA编程思想",第二个title中"python"不在替换范围内,所以结果为"python数据分析"。
2. 多余字符删除规则
如果from_chars的长度大于to_chars的长度,那么from_chars中超出to_chars长度的部分字符,会在原始字符串中被直接删除,不会进行任何替换。
比如from_chars是"abcd",to_chars是"AB",那么"a"替换为"A","b"替换为"B","c"和"d"会被直接从原始字符串中删除。
还是以上面的bookstore文档为例,执行以下XPath表达式:
//title/text()[translate(., 'java编程', 'JAVA')]
第一个title的处理结果为"JAVA思想",因为"编"和"程"两个字符在from_chars中超出to_chars的长度,所以被直接删除了。
3. to_chars长度大于from_chars的情况
如果to_chars的长度大于from_chars的长度,那么多出的部分字符会被忽略,不会参与替换操作,只有和from_chars对应位置的字符才会生效。
比如from_chars是"ab",to_chars是"ABCD",那么只有"A"和"B"会参与替换,"C"和"D"不会被使用。
4. 字符不重复匹配规则
from_chars中的每个字符只会匹配一次,即使同一个字符在from_chars中出现多次,也只会按照第一次出现的位置对应to_chars中的字符。比如from_chars是"aa",to_chars是"AB",那么原始字符串中的"a"只会被替换成"A",第二个"a"不会对应到"B"。
常见使用场景示例
场景1:去除字符串中的特殊字符
如果需要去除XML节点文本中的所有连字符,可以将连字符放到from_chars中,to_chars留空:
translate(//product/code/text(), '-', '')
如果原始code文本是"P-2023-001",处理后结果为"P2023001"。
场景2:统一字符串格式
将字符串中的全角数字转换为半角数字,可以将全角数字放到from_chars,半角数字放到to_chars:
translate(., '0123456789', '0123456789')
使用注意事项
- translate()函数区分大小写,大写字母和小写字母会被视为不同的字符,需要分别配置替换规则。
- 该函数只能进行单个字符的替换,无法实现字符串片段的替换,如果需要替换多字符片段,需要结合其他XPath函数或者处理逻辑实现。
- 如果原始字符串为空的节点,translate()函数会返回空字符串,不会报错。
- 在XSLT中使用translate()函数时,需要注意上下文节点的取值,避免取到错误的字符串内容。
XPathtranslate_functionXML解析XSLT修改时间:2026-06-14 23:18:19