首页 > 解决方案 > xslt 中 str:replace() 函数的运行时错误

问题描述

str:replace()在 xslt 1.0 中使用函数。它在某些情况下运行良好。在一种情况下,我正在使用replace()在 xml 文件中修改节点的值,它抛出了这个错误:

runtime error: file http://exslt.org/str/functions/replace/str.replace.function.xsl line 24 element copy-of
Cannot add an attribute node to a non-element node.

replace()通过导入此扩展功能来访问该功能:

<xsl:import href="http://exslt.org/str/functions/replace/str.replace.function.xsl"/>

谁能发现我可能无意中犯下的一些明显错误来触发此错误?

同时,我正在尝试制作一个示例xsl文件来显示尝试的代码行。我正在尝试使用--verbose命令中可用的命令行功能来可视化情况xsltproc

更新:

正如 Martin 所建议的,只需添加string()替换参数即可解决运行时错误,如下所示:

str:replace(string, object, string(object))

我有两个后续问题:

  1. 添加 string() 如何解决这里的问题?
  2. 现在它正在工作,但是在替换之后,我必须匹配更新的元素,key()false即使更新的元素已经在键集中,它也会给出,是否有可能replace()在某种意义上改变了元素?

例如:我的 key() 中已经有“alpha.beta”,并且通过使用将元素“alpha.gamma”替换为“alpha.beta” str:replace(),key() 在这种情况下返回 false?

标签: xmlxslt

解决方案


文档/规范http://exslt.org/str/functions/replace/index.html明确表示:“如果替换节点列表中的任何节点是属性节点或命名空间节点,则会出错。”。因此,您似乎在替换节点列表中有一个不受支持的属性节点。也许您只需要一个替换作为字符串,并且这种方式可以只string(@att)用于该参数。

链接库中的第 23-25 行

     <xsl:variable name="replace-nodes-rtf">
       <xsl:copy-of select="$replace" />
     </xsl:variable>

因此以这种方式将属性节点填充到变量中是不可能的,并且会导致失败。


推荐阅读