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

XSLT 1.0调用str:replace()运行时报错及后续key匹配问题咨询

问题1:为什么添加string()就能解决报错?

EXSLT的str:replace()函数在XSLT 1.0环境下的原生实现逻辑,会对传入的参数做类型判断:如果传入的参数是节点/节点集类型,函数内部会尝试用<xsl:copy-of>复制节点的完整结构,而不是直接取节点的文本值。
你之前直接传入节点对象作为替换参数时,如果你传入的是属性节点,或者函数内部执行copy-of的上下文目标不是元素节点,就会触发「无法向非元素节点添加属性节点」的运行时错误。
外层包裹string()后,会强制将节点类型的参数转换为纯字符串值,函数接收到字符串参数后就不会执行节点复制逻辑,自然不会触发相关报错。

问题2:为什么替换后的结果无法用key()匹配?

这是XSLT 1.0的结果树片段(RTF)类型特性导致的,和str:replace()的返回值类型有关:
str:replace()执行后返回的默认类型是结果树片段,而非XSLT 1.0中key()函数要求匹配的原生字符串类型。哪怕两者的文本内容完全一致,类型不一致时key()匹配也会返回false。
你只需要在把替换结果传给key()时,外层同样包裹一层string()做强制类型转换,就能正常匹配了。如果转换后还是匹配失败,可以额外检查替换结果是否带了多余的不可见字符(比如换行、前后空格)。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.06 00:06:03