如何解决在解析的 JSON 嵌套数组上运行 foreach
使用解析的 JSON 文件作为数据输入构建表。 JSON 数组中的每个值都应该被分配,同时在运行代码时,JSON 数组中的两个值都被注入到同一个元素 xml 值中。
在我构建“xsl:element”的代码区域中,我可以在以下内容之间手动切换,一次给我一个数组内容,但我不明白如何让代码迭代数组数据:
<xsl:value-of select="*[1]"/>
<xsl:value-of select="*[2]"/>
JSON:
<data>
{
"balance-sheets": {
"sheet-results": {
"sales": {"values": [3,5],"title": "Annual sales summary"},"costs": {"values": [7,9],"title": "Accumulated costs per year"}
}
}
}
</data>
XSL:
<?xml version="1.0" encoding="UTF-8"?>
<xsl:transform version="3.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:ix="http://www.example.org/1"
xmlns:se="http://www.example.org/2"
expand-text="yes"
>
<xsl:output method="xml" indent="yes"/>
<!-- Block all data that has no user defined template -->
<xsl:mode on-no-match="shallow-skip"/>
<xsl:attribute-set name="base">
<xsl:attribute name="name">se:{parent::*/@key}</xsl:attribute>
</xsl:attribute-set>
<!-- Parse JSON file content to XML map -->
<xsl:template match="data">
<store>
<xsl:apply-templates select="json-to-xml(.)/*"/>
</store>
</xsl:template>
<xsl:template match="*[@key='sheet-results']">
<table>
<xsl:for-each select="*">
<tr>
<td>
<xsl:value-of select="*[2]"/>
</td>
<xsl:for-each select="*">
<td>
<span>
<xsl:element
name="ix:nonFraction"
use-attribute-sets="base"
>
<xsl:value-of select="*"/>
</xsl:element>
</span>
</td>
</xsl:for-each>
</tr>
</xsl:for-each>
</table>
</xsl:template>
</xsl:transform>
结果:
<?xml version="1.0" encoding="UTF-8"?>
<store xmlns:ix="http://www.example.org/1" xmlns:se="http://www.example.org/2">
<table>
<tr>
<td>Annual sales summary</td>
<td>
<span>
<ix:nonFraction name="se:sales">3 5</ix:nonFraction>
</span>
</td>
<td>
<span>
<ix:nonFraction name="se:sales"/>
</span>
</td>
</tr>
<tr>
<td>Accumulated costs per year</td>
<td>
<span>
<ix:nonFraction name="se:costs">7 9</ix:nonFraction>
</span>
</td>
<td>
<span>
<ix:nonFraction name="se:costs"/>
</span>
</td>
</tr>
</table>
</store>
想要的结果:
<?xml version="1.0" encoding="UTF-8"?>
<store xmlns:ix="http://www.example.org/1" xmlns:se="http://www.example.org/2">
<table>
<tr>
<td>Annual sales summary</td>
<td>
<span>
<ix:nonFraction name="se:sales">3</ix:nonFraction>
</span>
</td>
<td>
<span>
<ix:nonFraction name="se:sales">5</ix:nonFraction>
</span>
</td>
</tr>
<tr>
<td>Accumulated costs per year</td>
<td>
<span>
<ix:nonFraction name="se:costs">7</ix:nonFraction>
</span>
</td>
<td>
<span>
<ix:nonFraction name="se:costs">9</ix:nonFraction>
</span>
</td>
</tr>
</table>
</store>
解决方法
考虑以下简化示例:
XSLT 3.0
<xsl:stylesheet version="3.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:js="http://www.w3.org/2005/xpath-functions"
exclude-result-prefixes="js">
<xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/>
<xsl:template match="/">
<table>
<xsl:for-each select="json-to-xml(data)/js:map/js:map/js:map/js:map">
<tr>
<th>
<xsl:value-of select="js:string[@key='title']"/>
</th>
<xsl:for-each select="js:array[@key='values']/js:number">
<td>
<xsl:value-of select="."/>
</td>
</xsl:for-each>
</tr>
</xsl:for-each>
</table>
</xsl:template>
</xsl:stylesheet>
应用于您的输入示例,这将返回:
结果
<?xml version="1.0" encoding="UTF-8"?>
<table>
<tr>
<th>Annual sales summary</th>
<td>3</td>
<td>5</td>
</tr>
<tr>
<th>Accumulated costs per year</th>
<td>7</td>
<td>9</td>
</tr>
</table>
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。