首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >在XSLT 1.0中,通过包含多个属性"stats“的XML在JSON中创建一个属性"stats”

在XSLT 1.0中,通过包含多个属性"stats“的XML在JSON中创建一个属性"stats”
EN

Stack Overflow用户
提问于 2019-03-20 02:57:42
回答 2查看 62关注 0票数 -1

我有一个带有元素的XML输入,这些元素有许多名为"stats“的属性。

我只想为每个现有属性创建一个属性元素"stats“,并将其作为一个键放入JSON中。

输入:

代码语言:javascript
复制
<STATS>
    <CODE>Apple</CODE><COUNT>4</COUNT>
</STATS>
<STATS>
    <CODE>Orange</CODE><COUNT>1876</COUNT>
</STATS>
<STATS>
    <CODE>Kiwi</CODE><COUNT>9</COUNT>
</STATS>

输出:

代码语言:javascript
复制
"STATS":{
    "Apple":4,
    "Orange":1876,
    "Kiwi": 9
}

更新:我已经尝试过这个XSL

代码语言:javascript
复制
<?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>&quot;</xsl:text><xsl:value-of select="."/><xsl:text>&quot;</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>

但这似乎行不通。它给出了以下输出:

代码语言:javascript
复制
    "STATS" :{

    "CODE" :"Apple",
    "COUNT" :"4"
            },
    "STATS" :{

    "CODE" :"Orange",
    "COUNT" :"1876"
            },
    "STATS" :{

    "CODE" :"Kiwi",
    "COUNT" :"9"
            }

这样做的正确方法是什么?

EN

回答 2

Stack Overflow用户

发布于 2019-03-20 03:59:14

给定一个格式良好的(!)输入,如下所示:

XML

代码语言:javascript
复制
<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

代码语言:javascript
复制
<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返回:

结果

代码语言:javascript
复制
"STATS":{"Apple":4,"Orange":1876,"Kiwi":9}
票数 1
EN

Stack Overflow用户

发布于 2019-03-20 04:06:59

实现这种JSON输出的一种可能方法是使用以下XSLT-1.0代码。它假定您的输入XML包装在一个名为root的元素中,以使其格式良好。

因此,输入的XML文件如下所示:

代码语言:javascript
复制
<?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文件如下所示:

代码语言:javascript
复制
<?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: {&#xa;</xsl:text>
        <xsl:apply-templates select="STATS" />
    <xsl:text>&#xa;}</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>,&#xa;</xsl:text></xsl:if>
</xsl:template>

</xsl:stylesheet>

它的输出是:

代码语言:javascript
复制
STATS: {
  "Apple": 4,
  "Orange": 1876,
  "Kiwi": 9
}
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/55248247

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档