无法从 JSON 数据中获取价值
Cannot get out value from JSON data
正在解析 XSLT 中的 JSON 数据并尝试获取指定的键值。我控制了 XSLT 在解析 JSON 时生成的 XML 映射,我确实找到了值为“car”的键。
问题:我没有在结果中得到预期的值。
您可以在此处找到代码:xsltfiddle
这里添加相同的代码:
JSON:
<data>
{
"storage": {
"car": "Volvo"
}
}
</data>
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="xml" indent="yes" html-version="5"/>
<!-- Block all data that has no user defined template -->
<xsl:mode on-no-match="shallow-skip"/>
<!-- Transform JSON to XML -->
<xsl:template match="data">
<xsl:apply-templates select="json-to-xml(.)/*"/>
<!-- Select -->
<xsl:value-of select="//*[@key='car']"/>
</xsl:template>
<!-- Print map -->
<!--
<xsl:template match="*[@key = 'storage']">
<xsl:copy-of select=".."/>
</xsl:template>
-->
</xsl:stylesheet>
结果
<?xml version="1.0" encoding="UTF-8"?>
想要的结果
<?xml version="1.0" encoding="UTF-8"?>
Volvo
我想你需要这个:
<!-- Transform JSON to XML -->
<xsl:template match="data">
<!-- Select -->
<xsl:value-of select="json-to-xml(.)//*[@key='car']"/>
</xsl:template>
获得:
<?xml version="1.0" encoding="UTF-8"?>Volvo
为此,我不会将 JSON 转换为 XML:我会将其解析为 XDM 映射,然后在映射中查找值。因此:
<xsl:value-of select="parse-json(.)?storage?car"/>
您在评论中写道:
Still don't understand though why my code does not work
事实上,我们经常犯这样的错误,即只提供有效的代码,却不告诉您哪里做错了。
你的错误在这里:
<xsl:apply-templates select="json-to-xml(.)/*"/>
<xsl:value-of select="//*[@key='car']"/>
您有两条指令,您希望第二条指令对第一条指令的结果进行操作。但这不是 XSLT 的工作方式;这些指令中的每一个都对相同的输入起作用(具体来说,它们中的每一个都将源文档中的 data
元素作为输入)。所以 //*[@key='car']
没有 select 任何东西,因为在原始源文档中没有任何东西与此匹配。
如果你想让第二条指令应用到第一条指令的结果,你可以把第一条指令的结果放在一个变量中:
<xsl:variable name="converted-input">
<xsl:apply-templates select="json-to-xml(.)/*"/>
</xsl:variable>
<xsl:value-of select="$converted-input//*[@key='car']"/>
或者,正如@sspsujit 所做的那样,您可以将其全部折叠成一条指令,因为 xsl:apply-templates
实际上并没有做任何有趣的事情。
正在解析 XSLT 中的 JSON 数据并尝试获取指定的键值。我控制了 XSLT 在解析 JSON 时生成的 XML 映射,我确实找到了值为“car”的键。
问题:我没有在结果中得到预期的值。
您可以在此处找到代码:xsltfiddle
这里添加相同的代码:
JSON:
<data>
{
"storage": {
"car": "Volvo"
}
}
</data>
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="xml" indent="yes" html-version="5"/>
<!-- Block all data that has no user defined template -->
<xsl:mode on-no-match="shallow-skip"/>
<!-- Transform JSON to XML -->
<xsl:template match="data">
<xsl:apply-templates select="json-to-xml(.)/*"/>
<!-- Select -->
<xsl:value-of select="//*[@key='car']"/>
</xsl:template>
<!-- Print map -->
<!--
<xsl:template match="*[@key = 'storage']">
<xsl:copy-of select=".."/>
</xsl:template>
-->
</xsl:stylesheet>
结果
<?xml version="1.0" encoding="UTF-8"?>
想要的结果
<?xml version="1.0" encoding="UTF-8"?>
Volvo
我想你需要这个:
<!-- Transform JSON to XML -->
<xsl:template match="data">
<!-- Select -->
<xsl:value-of select="json-to-xml(.)//*[@key='car']"/>
</xsl:template>
获得:
<?xml version="1.0" encoding="UTF-8"?>Volvo
为此,我不会将 JSON 转换为 XML:我会将其解析为 XDM 映射,然后在映射中查找值。因此:
<xsl:value-of select="parse-json(.)?storage?car"/>
您在评论中写道:
Still don't understand though why my code does not work
事实上,我们经常犯这样的错误,即只提供有效的代码,却不告诉您哪里做错了。
你的错误在这里:
<xsl:apply-templates select="json-to-xml(.)/*"/>
<xsl:value-of select="//*[@key='car']"/>
您有两条指令,您希望第二条指令对第一条指令的结果进行操作。但这不是 XSLT 的工作方式;这些指令中的每一个都对相同的输入起作用(具体来说,它们中的每一个都将源文档中的 data
元素作为输入)。所以 //*[@key='car']
没有 select 任何东西,因为在原始源文档中没有任何东西与此匹配。
如果你想让第二条指令应用到第一条指令的结果,你可以把第一条指令的结果放在一个变量中:
<xsl:variable name="converted-input">
<xsl:apply-templates select="json-to-xml(.)/*"/>
</xsl:variable>
<xsl:value-of select="$converted-input//*[@key='car']"/>
或者,正如@sspsujit 所做的那样,您可以将其全部折叠成一条指令,因为 xsl:apply-templates
实际上并没有做任何有趣的事情。