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

如何在XSLT中拼接变量与JSON查找表达式并完成求值?

XSLT中动态执行JSONPath表达式替换占位符的解决方案

问题场景

我通过json-doc()将JSON数据存储到变量$db.data.work中,需要处理包含如下占位符的XML内容:

{API:?[?role_en='Composer']?person?firstName} {API:?[?role_en='Composer']?person?lastName})

需求是提取API:后的表达式,从$db.data.work中取值并替换占位符。尝试直接拼接变量与表达式字符串后求值失败,仅单个key的注入方式能正常工作,需要找到正确的动态求值方法。

原XSLT模板代码:

<xsl:template name="replace.api.placeholders">
    <xsl:variable name="pattern.api.placeholders" as="xs:string" expand-text="no">\API:(.+?)\}</xsl:variable>
    <xsl:analyze-string select="." regex="{$pattern.api.placeholders}">
      <xsl:matching-substring>
        <xsl:value-of select="
            let $db.key := regex-group(1)
            return
              if ($db.data.work&lt;appended-retrieved-expression&gt;) then
                $db.data.work&lt;appended-retrieved-expression
                else
                  ."/>
      </xsl:matching-substring>
      <xsl:non-matching-substring>
        <xsl:value-of select="."/>
      </xsl:non-matching-substring>
    </xsl:analyze-string>
</xsl:template>

解决方案

利用XSLT 3.0的xsl:evaluate指令动态执行表达式,无需手动拼接变量与表达式字符串,直接将$db.data.work作为上下文项传递即可。

修改后的模板代码:

<xsl:template name="replace.api.placeholders">
    <xsl:variable name="pattern.api.placeholders" as="xs:string" expand-text="no">\API:(.+?)\}</xsl:variable>
    <xsl:analyze-string select="." regex="{$pattern.api.placeholders}">
        <xsl:matching-substring>
            <xsl:variable name="expr" select="regex-group(1)"/>
            <!-- 动态执行表达式,上下文设为JSON数据变量 -->
            <xsl:evaluate xpath="$expr" context-item="$db.data.work"/>
        </xsl:matching-substring>
        <xsl:non-matching-substring>
            <xsl:value-of select="."/>
        </xsl:non-matching-substring>
    </xsl:analyze-string>
</xsl:template>

补充说明

  1. 版本要求:xsl:evaluate是XSLT 3.0特性,需使用支持该版本的处理器(如Saxon 9.8及以上版本)。
  2. 错误处理:如果担心表达式执行失败(比如路径不存在),可以添加异常捕获:
<xsl:matching-substring>
    <xsl:variable name="expr" select="regex-group(1)"/>
    <xsl:try>
        <xsl:evaluate xpath="$expr" context-item="$db.data.work"/>
        <xsl:catch>
            <!-- 执行失败时返回原占位符 -->
            <xsl:value-of select="."/>
        </xsl:catch>
    </xsl:try>
</xsl:matching-substring>

内容的提问来源于stack exchange,提问作者oleksii.sapov-erlinger

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.18 15:52:42