如何通过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> </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> </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
相关产品推荐
相关产品推荐

