将局部变量更改为全局变量不起作用
Change local to global variable does not work
我打算集中所有变量,从而将它们设置为驻留在模板外部的全局变量。如下所述,如果在模板中本地添加完全相同的变量,则它会起作用。代码被大量最小化以适应 SO 问题。全局变量的数量会更多。
问题:
将变量移出模板并将其用作全局变量未达到 return 预期结果。
您在 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
您的策略“我计划集中所有变量,从而将它们设置为驻留在模板外部的全局变量。”没有任何意义,全局变量是相对于全局上下文项求值的,任何局部变量是相对于模板的上下文项或模板中的进一步嵌套指令求值的。
所以你的全局尝试 <xsl:variable name="headings" select="//*[@key='xbrl:concept'][. = 'se:CompanyName']/../*[@key='value']"/>
会在全局上下文项中寻找属性 key
为 xbrl:concept
的元素,据我所知,这是你的文档data
元素包含一些 JSON。显然,该文档没有任何此类元素。
怀疑您的所有路径都是绝对路径,从根目录开始 //
并查找文档中的任何地方,但目前您甚至没有正确的根目录来使用“全局”变量”。
你可以试试
<xsl:variable name="json-xml-doc" select="json-to-xml(data)"/>
然后使用例如
<xsl:variable name="headings" select="$json-xml-doc//*[@key='xbrl:concept'][. = 'se:CompanyName']/../*[@key='value']"/>
但我不建议,最后,我认为,大多数查找表达式更容易编写、阅读和维护,阅读、理解和维护更短,而且如果它们与您的相关,则可能通常更高效上下文项。
我打算集中所有变量,从而将它们设置为驻留在模板外部的全局变量。如下所述,如果在模板中本地添加完全相同的变量,则它会起作用。代码被大量最小化以适应 SO 问题。全局变量的数量会更多。
问题:
将变量移出模板并将其用作全局变量未达到 return 预期结果。
您在 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
您的策略“我计划集中所有变量,从而将它们设置为驻留在模板外部的全局变量。”没有任何意义,全局变量是相对于全局上下文项求值的,任何局部变量是相对于模板的上下文项或模板中的进一步嵌套指令求值的。
所以你的全局尝试 <xsl:variable name="headings" select="//*[@key='xbrl:concept'][. = 'se:CompanyName']/../*[@key='value']"/>
会在全局上下文项中寻找属性 key
为 xbrl:concept
的元素,据我所知,这是你的文档data
元素包含一些 JSON。显然,该文档没有任何此类元素。
怀疑您的所有路径都是绝对路径,从根目录开始 //
并查找文档中的任何地方,但目前您甚至没有正确的根目录来使用“全局”变量”。
你可以试试
<xsl:variable name="json-xml-doc" select="json-to-xml(data)"/>
然后使用例如
<xsl:variable name="headings" select="$json-xml-doc//*[@key='xbrl:concept'][. = 'se:CompanyName']/../*[@key='value']"/>
但我不建议,最后,我认为,大多数查找表达式更容易编写、阅读和维护,阅读、理解和维护更短,而且如果它们与您的相关,则可能通常更高效上下文项。