【问题标题】:wso2 convert xml to json with arraywso2 使用数组将 xml 转换为 json
【发布时间】:2019-10-29 22:52:12
【问题描述】:

我正在尝试使用 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" }
        ]
    }
}

这是一个尝试在 WSo2 中添加数组的示例输入 XML 文件。这无法在 JSON 输出中添加数组。

a345ea1b59d c867b9511fa201

CCH2 c867b9511fa201 c867b9511fa201 5005854

                    <xyz:AStatus xyz:Descriptor="Pending">
                        <xyz:ID xyz:type="ID">5e3ae98c7e4b4af9836cd</xyz:ID>
                        <xyz:ID xyz:type="DID">PENDING</xyz:ID>
                    </xyz:AStatus>

                    <xyz:Net>0</xyz:Net>
                    <xyz:AMoment>2019-10-10</xyz:AMoment>
                </xyz:Report_Entry>
            </xyz:Report_Data>
        </env:Body>
    </env:Envelope>
</xyz:Body> </xyz:Envelope>

格式正确,没有任何问题,因为它有多个报告条目:

a345ea1b59d c867b9511fa201

CCH2 c867b9511fa201 c867b9511fa201 5005854

                    <xyz:AStatus xyz:Descriptor="Pending">
                        <xyz:ID xyz:type="ID">5e3ae98c7e4b4af9836cd</xyz:ID>
                        <xyz:ID xyz:type="DID">PENDING</xyz:ID>
                    </xyz:AStatus>

                    <xyz:Net>0</xyz:Net>
                    <xyz:AMoment>2019-10-10</xyz:AMoment>
                </xyz:Report_Entry>
               <xyz:Report_Entry>
                    <xyz:BusinessAsset xyz:Descriptor="12">
                        <xyz:ID xyz:type="ID">a345ea1b59d</xyz:ID>
                    </xyz:BusinessAsset>
                    <xyz:CH xyz:Descriptor="UCCH2">
                        <xyz:ID xyz:type="ID">c867b9511fa201</xyz:ID>
                        <xyz:ID xyz:type="OID"
                            >CCH2</xyz:ID>
                        <xyz:ID xyz:type="CID"
                            >CCH2</xyz:ID>
                    </xyz:CH>
                    <xyz:CH xyz:Descriptor="UCCH3">
                        <xyz:ID xyz:type="ID">c867b9511fa201</xyz:ID>
                        <xyz:ID xyz:type="OID"
                            >CCH3</xyz:ID>
                        <xyz:ID xyz:type="CID"
                            >CCH3</xyz:ID>
                    </xyz:CH>
                  <xyz:CH xyz:Descriptor="UCCH4">
                        <xyz:ID xyz:type="ID">c867b9511fa201</xyz:ID>
                        <xyz:ID xyz:type="OID"
                            >CCH4</xyz:ID>
                        <xyz:ID xyz:type="CID"
                            >CCH4</xyz:ID>
                    </xyz:CH>
                    <xyz:AID>5005854</xyz:AID>

                    <xyz:AStatus xyz:Descriptor="Pending">
                        <xyz:ID xyz:type="ID">5e3ae98c7e4b4af9836cd</xyz:ID>
                        <xyz:ID xyz:type="DID">PENDING</xyz:ID>
                    </xyz:AStatus>

                    <xyz:Net>0</xyz:Net>
                    <xyz:AMoment>2019-10-10</xyz:AMoment>
                </xyz:Report_Entry>
            </xyz:Report_Data>
        </env:Body>
    </env:Envelope>
</xyz:Body> </xyz:Envelope>

【问题讨论】:

    标签: json xml xslt wso2


    【解决方案1】:

    你可以试试这个:

        <?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>&#x0A;</xsl:text>
            <xsl:text>&#x2003;"</xsl:text><xsl:value-of select="local-name()"/><xsl:text>":</xsl:text>
            <xsl:for-each select="Report_Entry">
                <xsl:text>{</xsl:text><xsl:text>&#x0A;</xsl:text>
                <xsl:text>&#x2003;&#x2003;"</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">[&#x0A;</xsl:if>
                    <xsl:if test="not(following-sibling::*) and position()=1"><xsl:text>&#x0A;</xsl:text></xsl:if>
                    <xsl:text>&#x2003;&#x2003;&#x2003;{</xsl:text><xsl:text>"</xsl:text><xsl:value-of select="local-name()"/><xsl:text>": </xsl:text><xsl:value-of select="concat('&quot;',.,'&quot;')"/><xsl:text>}</xsl:text><xsl:text>&#x0A;</xsl:text>
                    <xsl:if test="preceding-sibling::* and position()=last()">&#x2003;&#x2003;]&#x0A;</xsl:if>
                </xsl:for-each>
                <xsl:text>&#x2003;}</xsl:text><xsl:text>&#x0A;</xsl:text>
            </xsl:for-each>
            <xsl:text>}</xsl:text>
        </xsl:template>
    </xsl:stylesheet>
    

    【讨论】:

    • 我刚刚提供了一个示例数据。但我的 xml 更复杂,并且有嵌套的节点和数组。我想创建一个通用的 xslt,而不是为一个场景硬编码方括号
    • @SPB 如果您有其他嵌套节点,那么您 S/B 使用嵌套的 xsl:for-each。
    【解决方案2】:

    如果你想将'Report_Entry'呈现为一个JSON数组,不管它有一个或多个元素,这需要在XSLT文件中完成,并且需要包含下面的XML处理指令。

    <xsl:processing-instruction name="xml-multiple">Report_Entry</xsl:processing-instruction>
    

    【讨论】:

    • 我只是给了一个样本数据。但是我的报告条目中有更多的嵌套数组。添加上述语句时出现 wso2 错误:无法使用以下命令执行 XSLT 转换:Value {name ='null', keyValue ='gov:trunk/xslt/transform.xsl'
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-12-04
    • 2018-07-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-01-30
    • 2016-07-03
    相关资源
    最近更新 更多