XSLT 3.0 局部变量改为全局变量后无法正常取值问题求助
问题根因
XSLT 全局变量在转换任务初始化阶段就会完成计算,此时json-to-xml()转换逻辑尚未执行,原始输入文档中仅存在外层<data>节点包裹的JSON纯文本,不存在你XPath表达式中匹配的带@key属性的节点,因此全局变量计算结果为空。
而局部变量是在匹配//*[@key='facts']的模板执行阶段才计算,此时json-to-xml()已经完成JSON到XML的转换,生成了带@key属性的节点树,因此可以正常匹配到结果。
解决方案
你可以先将JSON转换后的XML结构预存为全局预处理变量,所有业务全局变量都基于这个预处理后的变量定义,即可实现集中管理全局变量的需求,修改后的完整XSLT代码如下:
<?xml version="1.0" encoding="UTF-8"?> <xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="3.0"> <xsl:output method="xhtml" indent="yes" html-version="5"/> <xsl:mode on-no-match="shallow-skip"/> <!-- 全局预处理:提前将JSON转换为XML节点树 --> <xsl:variable name="jsonXml" select="json-to-xml(/data)"/> <!-- 全局业务变量统一基于预处理后的节点树定义 --> <xsl:variable name="headings" select="$jsonXml//*[@key='xbrl:concept'][. = 'se:CompanyName']/../*[@key='value']"/> <!-- 入口模板直接处理预处理后的XML节点 --> <xsl:template match="/"> <xsl:apply-templates select="$jsonXml/*"/> </xsl:template> <xsl:template match="//*[@key='facts']"> <xsl:value-of select="$headings"/> </xsl:template> </xsl:stylesheet>
修改后运行即可输出预期结果。
内容的提问来源于stack exchange,提问作者Toolbox
相关产品推荐
相关产品推荐

