我正在尝试将XML有效负载转换为jsonx格式。当输入XML具有属性时,我的代码不起作用,请您提供帮助。应用程序元素应该以 json:object 的形式出现,但它以 json:string 的形式出现 我可以知道如何将应用程序元素保留为 json:对象吗?
下面是我正在尝试的代码:我在下面用于代码测试
<?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>
<xsl:template match="*[not(*) and not(@*)]">
或使用
<xsl:template match="*[not(*) and string-length(.) > 0]">
而不是您的字符串模板
<xsl:template match="*[not(*)]">