在解析的 JSON 嵌套数组上运行 foreach
Posted
技术标签:
【中文标题】在解析的 JSON 嵌套数组上运行 foreach【英文标题】:Run foreach on parsed JSON nested array 【发布时间】:2021-08-21 22:06:47 【问题描述】:使用解析的 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>
【问题讨论】:
【参考方案1】:考虑以下简化示例:
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>
【讨论】:
以上是关于在解析的 JSON 嵌套数组上运行 foreach的主要内容,如果未能解决你的问题,请参考以下文章