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

如何通过XSLT查询获取application.yml中的配置值?

解决方案建议

先解决报错问题

你遇到的XPST0008: Variable $IsRelatedInstance has not been declared错误,是因为XSLT代码第25行引用了$IsRelatedInstance变量,但没有提前用<xsl:variable>声明它。请检查对应行的代码,补充该变量的定义,或者删除对未声明变量的引用。

读取application.yml并提取x、y值的实现方案

你的核心需求是从YAML文件中提取静态键值,以下是两种可行方案:

方案1:手动解析简单YAML(适用于无嵌套的键值对)

如果你的application.yml只有x: 1、y: 2这类简单键值,无需复杂嵌套,可以通过字符串处理直接提取:

<xsl:stylesheet version="3.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
                xmlns:xs="http://www.w3.org/2001/XMLSchema">

    <!-- 读取application.yml,注意路径:同目录下直接写文件名即可 -->
    <xsl:variable name="yaml-content" select="unparsed-text('application.yml')" as="xs:string"/>

    <!-- 自定义函数:根据键名提取YAML值 -->
    <xsl:function name="local:get-yaml-value" as="xs:string?">
        <xsl:param name="yaml-text" as="xs:string"/>
        <xsl:param name="key" as="xs:string"/>
        <!-- 匹配目标键的行,去除键名和冒号,提取值 -->
        <xsl:variable name="target-line" select="tokenize($yaml-text, '\n')[matches(., concat('^\s*', $key, '\s*:\s*'))]"/>
        <xsl:if test="$target-line">
            <xsl:value-of select="replace($target-line, concat('^\s*', $key, '\s*:\s*'), '')"/>
        </xsl:if>
    </xsl:function>

    <xsl:template match="/" name="main">
        <!-- 获取x的值 -->
        <xsl:value-of select="local:get-yaml-value($yaml-content, 'x')"/>
        <xsl:text>&#10;</xsl:text>
        <!-- 获取y的值 -->
        <xsl:value-of select="local:get-yaml-value($yaml-content, 'y')"/>
    </xsl:template>

</xsl:stylesheet>

方案2:使用Saxon扩展解析复杂YAML(适用于嵌套结构)

如果你的YAML有多层嵌套,需要完整解析,可以使用Saxon PE/EE版本的扩展函数将YAML转为XDM节点:

<xsl:stylesheet version="3.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
                xmlns:xs="http://www.w3.org/2001/XMLSchema"
                xmlns:saxon="http://saxon.sf.net/">

    <!-- 读取并解析YAML为可查询的节点 -->
    <xsl:variable name="yaml-node" select="saxon:parse-yaml(unparsed-text('application.yml'))"/>

    <xsl:template match="/" name="main">
        <!-- 直接通过节点路径提取值 -->
        <xsl:value-of select="$yaml-node/x"/>
        <xsl:text>&#10;</xsl:text>
        <xsl:value-of select="$yaml-node/y"/>
    </xsl:template>

</xsl:stylesheet>

原代码的其他问题修正

  • 原代码中select"unparsed-text('.properties')"语法错误,缺少等号,正确写法是select="unparsed-text('application.yml')"
  • 原代码中的f:getProperty函数未定义,需要自行实现(如方案1的自定义函数)或使用扩展函数
  • 确保文件路径正确:如果XSLT和application.yml都在main/resources目录下,直接写文件名即可,无需相对路径前缀

内容的提问来源于stack exchange,提问作者Bidyanarayan Sahu

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.21 00:40:14