如何在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<appended-retrieved-expression>) then $db.data.work<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>
补充说明
- 版本要求:
xsl:evaluate是XSLT 3.0特性,需使用支持该版本的处理器(如Saxon 9.8及以上版本)。 - 错误处理:如果担心表达式执行失败(比如路径不存在),可以添加异常捕获:
<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
相关产品推荐
相关产品推荐

