将xml转换为jsonx格式

时间:2019-08-20 22:47:56

标签: xml xslt xslt-1.0 xslt-2.0 jsonx

我正在尝试将XML有效负载转换为jsonx格式。输入XML具有属性时,我的代码不起作用,请您提供帮助。应用程序元素应该作为json:object出现,但它作为json:string出现 我可以知道如何将Applicaton元素保留为json:object吗?

以下是我正在尝试的代码: 我在下面用来进行代码测试

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"  xmlns:soapenv= "http://schemas.xmlsoap.org/soap/envelope/"  xmlns:json="http://www.ibm.com/xmlns/prod/2009/jsonx" version="1.0"> 
    <xsl:output indent="yes" encoding="UTF-8" omit-xml-declaration="yes"/>
    <xsl:strip-space elements="*"/>
    <xsl:template match="*[local-name()='Envelope']">
        <xsl:apply-templates/>
    </xsl:template>
    <xsl:template match="*[local-name()='Body']">
        <json:object name="Body">
            <xsl:apply-templates/>
        </json:object>
    </xsl:template>
    <!-- Array -->
    <xsl:template match="*[*[2]][name(*[1]) = name(*[2])]">
        <json:object name="{local-name()}">
            <json:array name="{local-name(*[1])}">
                <xsl:apply-templates/>
            </json:array>
        </json:object>
    </xsl:template>
    <!-- Array member -->
    <xsl:template match="*[parent::*[ name(*[1])=name(*[2]) ]] | /">
        <json:object>
            <xsl:apply-templates/>    
        </json:object>
    </xsl:template>
    <!-- Object -->
    <xsl:template match="*">
        <json:object name="{local-name()}">     
            <xsl:apply-templates select="@*|node()"/>
        </json:object>
    </xsl:template>
    <!-- String -->
    <xsl:template match="*[not(*)]">
        <json:string name="{local-name()}">
            <xsl:value-of select="."/>          
            <xsl:apply-templates select="@*"/>          
        </json:string>  
    </xsl:template>

    <xsl:template match="@*">
        <json:string name="{local-name()}">
            <xsl:value-of select="."/>                  
        </json:string>     
    </xsl:template> 

</xsl:stylesheet>

输入XML:输入我正在使用的有效负载xml

 <?xml version="1.0" encoding="utf-8"?>
    <soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
        <soap:Body>
            <SendEmailResponse xmlns="http://webservices.abcd.com/">
                <SendEmailResult>
                    <EmailSpecifications xmlns="">
                        <Status EmailID="0" Success="N">
                            <ErrorCode>1010</ErrorCode>
                            <ErrorDescription>Invalid AppID</ErrorDescription>
                        </Status>
                        <Application AppID="0" EntityID="0" />
                    </EmailSpecifications>
                </SendEmailResult>
            </SendEmailResponse>
        </soap:Body>
    </soap:Envelope>

输出jsonx我现在得到的内容:期望输出中的<json:object name="Application">但得到<json:string name="Application">

<json:object
xmlns:json="http://www.ibm.com/xmlns/prod/2009/jsonx"
xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/"
>

    <json:object name="Body">
        <json:object name="SendEmailResponse">
            <json:object name="SendEmailResult">
                <json:object name="EmailSpecifications">
                    <json:object name="Status">
                        <json:string name="EmailID">0</json:string>
                        <json:string name="Success">N</json:string>
                        <json:string name="ErrorCode">1010</json:string>
                        <json:string name="ErrorDescription">Invalid AppID</json:string>
                    </json:object>
                    <json:string name="Application">
                        <json:string name="AppID">0</json:string>
                        <json:string name="EntityID">0</json:string>
                    </json:string>
                </json:object>
            </json:object>
        </json:object>
    </json:object>

</json:object>

预期的输出::需要在输出XML中将<json:string name="Application">更改为<json:object name="Application">

    <json:object
xmlns:json="http://www.ibm.com/xmlns/prod/2009/jsonx"
xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/"
>

    <json:object name="Body">
        <json:object name="SendEmailResponse">
            <json:object name="SendEmailResult">
                <json:object name="EmailSpecifications">
                    <json:object name="Status">
                        <json:string name="EmailID">0</json:string>
                        <json:string name="Success">N</json:string>
                        <json:string name="ErrorCode">1010</json:string>
                        <json:string name="ErrorDescription">Invalid AppID</json:string>
                    </json:object>
                    <json:object name="Application">
                        <json:string name="AppID">0</json:string>
                        <json:string name="EntityID">0</json:string>
                    </json:object>
                </json:object>
            </json:object>
        </json:object>
    </json:object>

</json:object>

1 个答案:

答案 0 :(得分:1)

<xsl:template match="*[not(*) and not(@*)]">

或使用

<xsl:template match="*[not(*) and string-length(.) &gt; 0]">

代替您的字符串模板

<xsl:template match="*[not(*)]">
相关问题