You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

XSLT中tokenize函数报错及替换Saxon后结果异常求助

XSLT 2.0 tokenize函数问题的解决方法

一、解决默认TransformerFactory不支持XSLT 2.0的报错

JDK自带的javax.xml.transform.TransformerFactory是基于XSLT 1.0实现的,哪怕你在xsl:stylesheet里声明了version="2.0",它也无法识别XSLT 2.0特有的tokenize函数,这就是报错的核心原因。

解决办法是强制使用Saxon的TransformerFactory实现:

  • 要么在代码里设置系统属性:
    System.setProperty("javax.xml.transform.TransformerFactory", "net.sf.saxon.TransformerFactoryImpl");
    
  • 要么直接实例化Saxon的实现类,前提是你的项目已经引入了Saxon依赖(比如Saxon-HE)。

二、解决tokenize输出空格分隔内容的问题

你看到aa/bb/cc输出aa bb cc,是因为tokenize返回的是一个序列,直接用<xsl:value-of>输出时,XSLT会默认用空格拼接序列中的所有项。要拿到最后一个分割后的部分,需要结合last()函数定位序列的最后一项:

<!-- 假设目标字符串存储在$effect变量中 -->
<xsl:value-of select="tokenize($effect, '/')[last()]"/>
  • tokenize($effect, '/')会把字符串按/拆分成序列('aa', 'bb', 'cc')
  • [last()]筛选出序列的最后一个元素,也就是cc

如果你的字符串可能以/结尾(比如aa/bb/cc/),tokenize会生成一个空的最后项,这时候可以先过滤空值再取最后一个:

<xsl:value-of select="tokenize($effect, '/')[normalize-space() != ''][last()]"/>

内容的提问来源于stack exchange,提问作者Gilad Dahan

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.16 12:25:30