我正在尝试使用xslt将xml转换为json。当我有一个节点时,JSON输出不包含数组,但是当它有多个节点时,它将显示为数组
如果我只有一个报告条目,那么JSON输出如下(缺少数组):
XML:
<Report_Data>
<Report_Entry>
<ID>0025440</ID>
</Report_Entry>
</Report_Data>
结果:
{
"Report_Data": {
"Report_Entry":
{ "ID": "0025440" }
}
}
当我在XML中有多个条目时,输出如下(存在数组):
XML:
<Report_Data>
<Report_Entry>
<ID>0025440</ID>
</Report_Entry>
<Report_Entry>
<ID>00254401</ID>
</Report_Entry>
</Report_Data>
结果:
{
"Report_Data": {
"Report_Entry": [
{ "ID": "0025440" },
{ "ID": "0025441" }
]
}
}
如果您想将'Report_Entry'呈现为JSON数组,无论它具有一个还是多个元素,都需要在XSLT文件内部完成,并且需要在XML处理指令中包含以下内容。
<xsl:processing-instruction name="xml-multiple">Report_Entry</xsl:processing-instruction>
您可以尝试以下方法:
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:xs="http://www.w3.org/2001/XMLSchema"
exclude-result-prefixes="xs"
version="2.0">
<xsl:output method="text" omit-xml-declaration="yes" indent="yes"/>
<xsl:template match="Report_Data">
<xsl:text>{</xsl:text>
<xsl:text>
</xsl:text>
<xsl:text> "</xsl:text><xsl:value-of select="local-name()"/><xsl:text>":</xsl:text>
<xsl:for-each select="Report_Entry">
<xsl:text>{</xsl:text><xsl:text>
</xsl:text>
<xsl:text>  "</xsl:text><xsl:value-of select="local-name()"/><xsl:text>":</xsl:text>
<xsl:for-each select="ID">
<xsl:if test="following-sibling::* and position()=1">[
</xsl:if>
<xsl:if test="not(following-sibling::*) and position()=1"><xsl:text>
</xsl:text></xsl:if>
<xsl:text>   {</xsl:text><xsl:text>"</xsl:text><xsl:value-of select="local-name()"/><xsl:text>": </xsl:text><xsl:value-of select="concat('"',.,'"')"/><xsl:text>}</xsl:text><xsl:text>
</xsl:text>
<xsl:if test="preceding-sibling::* and position()=last()">  ]
</xsl:if>
</xsl:for-each>
<xsl:text> }</xsl:text><xsl:text>
</xsl:text>
</xsl:for-each>
<xsl:text>}</xsl:text>
</xsl:template>
</xsl:stylesheet>