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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.30 16:36:03