我有一个带有元素的XML输入,这些元素有许多名为"stats“的属性。
我只想为每个现有属性创建一个属性元素"stats“,并将其作为一个键放入JSON中。
输入:
<STATS>
<CODE>Apple</CODE><COUNT>4</COUNT>
</STATS>
<STATS>
<CODE>Orange</CODE><COUNT>1876</COUNT>
</STATS>
<STATS>
<CODE>Kiwi</CODE><COUNT>9</COUNT>
</STATS>
输出:
"STATS":{
"Apple":4,
"Orange":1876,
"Kiwi": 9
}
更新:我已经尝试过这个XSL
<?xml version="1.0"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="text"/>
<xsl:template match="/">{
<xsl:apply-templates select="*"/>}
</xsl:template>
<!-- Object or Element Property-->
<xsl:template match="*">
"<xsl:value-of select="name()"/>" :<xsl:call-template name="Properties">
<xsl:with-param name="parent" select="'Yes'"> </xsl:with-param>
</xsl:call-template>
</xsl:template>
<!-- Array Element -->
<xsl:template match="*" mode="ArrayElement">
<xsl:call-template name="Properties"/>
</xsl:template>
<!-- Object Properties -->
<xsl:template name="Properties">
<xsl:param name="parent"></xsl:param>
<xsl:variable name="childName" select="name(*[1])"/>
<xsl:choose>
<xsl:when test="not(*|@*)"><xsl:choose><xsl:when test="$parent='Yes'"> <xsl:text>"</xsl:text><xsl:value-of select="."/><xsl:text>"</xsl:text></xsl:when>
<xsl:otherwise>"<xsl:value-of select="name()"/>":"<xsl:value-of select="."/>"</xsl:otherwise>
</xsl:choose>
</xsl:when>
<xsl:when test="count(*[name()=$childName]) > 1">{ "<xsl:value-of select="$childName"/>" :[<xsl:apply-templates select="*" mode="ArrayElement"/>] }</xsl:when>
<xsl:otherwise>{
<xsl:apply-templates select="@*"/>
<xsl:apply-templates select="*"/>
}</xsl:otherwise>
</xsl:choose>
<xsl:if test="following-sibling::*">,</xsl:if>
</xsl:template>
<!-- Attribute Property -->
<xsl:template match="@*">"<xsl:value-of select="name()"/>" : "<xsl:value-of select="."/>",
</xsl:template>
</xsl:stylesheet>
但这似乎行不通。它给出了以下输出:
"STATS" :{
"CODE" :"Apple",
"COUNT" :"4"
},
"STATS" :{
"CODE" :"Orange",
"COUNT" :"1876"
},
"STATS" :{
"CODE" :"Kiwi",
"COUNT" :"9"
}
这样做的正确方法是什么?
发布于 2019-03-20 03:59:14
给定一个格式良好的(!)输入,如下所示:
XML
<root>
<STATS>
<CODE>Apple</CODE>
<COUNT>4</COUNT>
</STATS>
<STATS>
<CODE>Orange</CODE>
<COUNT>1876</COUNT>
</STATS>
<STATS>
<CODE>Kiwi</CODE>
<COUNT>9</COUNT>
</STATS>
</root>
以下样式表:
XSLT 1.0
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="text" encoding="utf-8"/>
<xsl:template match="/root">
<xsl:text>"STATS":{</xsl:text>
<xsl:for-each select="STATS">
<xsl:text>"</xsl:text>
<xsl:value-of select="CODE"/>
<xsl:text>":</xsl:text>
<xsl:value-of select="COUNT"/>
<xsl:if test="position()!=last()">,</xsl:if>
</xsl:for-each>
<xsl:text>}</xsl:text>
</xsl:template>
</xsl:stylesheet>
wil返回:
结果
"STATS":{"Apple":4,"Orange":1876,"Kiwi":9}
发布于 2019-03-20 04:06:59
实现这种JSON输出的一种可能方法是使用以下XSLT-1.0代码。它假定您的输入XML包装在一个名为root
的元素中,以使其格式良好。
因此,输入的XML文件如下所示:
<?xml version="1.0" encoding="UTF-8" ?>
<root>
<STATS>
<CODE>Apple</CODE><COUNT>4</COUNT>
</STATS>
<STATS>
<CODE>Orange</CODE><COUNT>1876</COUNT>
</STATS>
<STATS>
<CODE>Kiwi</CODE><COUNT>9</COUNT>
</STATS>
</root>
满足您需要的XSLT-1.0文件如下所示:
<?xml version="1.0"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="text"/>
<xsl:template match="/root">
<xsl:text>STATS: {
</xsl:text>
<xsl:apply-templates select="STATS" />
<xsl:text>
}</xsl:text>
</xsl:template>
<!-- STATS elements -->
<xsl:template match="STATS">
<xsl:text> "</xsl:text><xsl:value-of select="CODE"/><xsl:text>": </xsl:text>
<xsl:value-of select="COUNT"/>
<xsl:if test="position() != last()"><xsl:text>,
</xsl:text></xsl:if>
</xsl:template>
</xsl:stylesheet>
它的输出是:
STATS: {
"Apple": 4,
"Orange": 1876,
"Kiwi": 9
}
https://stackoverflow.com/questions/55248247
复制相似问题