【发布时间】:2021-11-14 04:24:12
【问题描述】:
我计划集中所有变量,因此将它们设置为位于模板之外的全局变量。如下所述,如果在模板中本地添加它,完全相同的变量将起作用。代码被大量最小化以适应 SO 问题。全局变量的数量会更多。
问题:
将变量移出模板并将其用作全局变量不会返回预期结果。
您在此xsltfiddle 中找到相同的代码。
代码:
数据 (JSON):
<data>
{
"report": {
"facts": [
{
"xbrl:concept": "se:CompanyName",
"value": "Great Company Ltd"
}
]
}
}
</data>
XSL:
<?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"/>
<!-- Parse JSON to XML -->
<xsl:template match="data">
<xsl:apply-templates select="json-to-xml(.)/*"/>
</xsl:template>
<!-- Global variable -->
<xsl:variable name="headings" select="//*[@key='xbrl:concept'][. = 'se:CompanyName']/../*[@key='value']"/>
<xsl:template match="//*[@key='facts']">
<!-- Local variable works when uncommented -->
<!--<xsl:variable name="headings" select="//*[@key='xbrl:concept'][. = 'se:CompanyName']/../*[@key='value']"/>-->
<xsl:value-of select="$headings"/>
</xsl:template>
</xsl:stylesheet>
结果:
<?xml version="1.0" encoding="UTF-8"?>
预期结果:
<?xml version="1.0" encoding="UTF-8"?>Great Company Ltd
【问题讨论】:
-
Martin Honnen 解释了为什么您的更改不起作用,但我也会退后一步,询问您想要实现的目标。与大多数编程语言一样,最好尽可能避免使用 XSLT 中的全局变量:它们会降低代码的可重用性。
-
通过在 XSLT 中使用解析的 JSON 数据,选择字符串变得相当长,这会影响代码的概览和可见性,尤其是在可能将代码移交给其他开发人员时。我希望实现的计划是让选择字符串成为全局变量的一部分,从而将长选择字符串分组在一个 XSLT 文件中。此外,通过将所有变量分组,我想看看是否可以缩小字符串长度。
-
那么也许你需要更多地使用函数而不是变量。