MarkLogic中XSLT替换XML节点报XSLT-BADPATTERN错误如何解决
问题解决方法
报错原因
你遇到的XSLT-BADPATTERN错误是因为在XSLT的match匹配路径中使用了MarkLogic XQuery专属的EQName Clark表示法(即Q{命名空间}本地名的语法),这种语法不属于标准XSLT规范,无法被XSLT解析器识别。
你已经在XSLT头部声明了before前缀对应http://coin/decimal命名空间,直接用前缀编写匹配路径即可。
修正后的完整代码
const beforeXsl = fn.head(xdmp.unquote( ` <xsl:transform xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:before="http://coin/decimal" version="2.0"> <!-- 声明入参,必须添加否则$replace会识别为未定义变量 --> <xsl:param name="replace" /> <!-- 替换为前缀写法的匹配路径,完全符合标准XSLT语法 --> <xsl:template match="/before:image/before:DE/before:before"> <!-- 直接用xsl:copy保留原节点的命名空间和属性,比手动创建元素更稳妥 --> <xsl:copy> <xsl:value-of select="$replace"/> </xsl:copy> </xsl:template> <xsl:template match="@* | node()"> <xsl:copy> <xsl:apply-templates select="@* | node()"/> </xsl:copy> </xsl:template> </xsl:transform> `)); // 调用时params里需要对应传入replace参数,示例: // const params = { replace: "Anglo-Dutch" }; xdmp.xsltEval(beforeXsl, doc, params)
验证说明
修改后运行即可实现需求:仅替换DE节点下的before节点值为传入的参数值,其余节点包括GBP下的before节点保持不变,输出结果和你预期的完全一致。
内容的提问来源于stack exchange,提问作者Chris
相关产品推荐
相关产品推荐

