【问题标题】:How to convert soap response containing CDATA to new formatted xml using xslt?如何使用 xslt 将包含 CDATA 的肥皂响应转换为新格式化的 xml?
【发布时间】:2017-06-28 15:29:23
【问题描述】:

我想把下面的代码转换成一些格式化的xml代码,

XSLT 转换的输入:

<soap:Envelope
    xmlns:soap='http://schemas.xmlsoap.org/soap/envelope/'>
    <soap:Body>
        <rejectQuoteXMLResponse
            xmlns='http://xxx.group.com'>
            <out>
                <![CDATA[

                    <TFGCPLResultXMLDO>
                        <processInstanceName>reejectQuoteXML</processInstanceName>
                        <duration>0</duration>
                        <accumulatedNumberOfExceptions>0</accumulatedNumberOfExceptions>
                        <accumulatedNumberOfErrors>0</accumulatedNumberOfErrors>
                        <accumulatedNumberOfWarnings>0</accumulatedNumberOfWarnings>
                        <numOfExceptions>0</numOfExceptions>
                        <numOfErrors>0</numOfErrors>
                        <numOfWarnings>0</numOfWarnings>
                        <BusinessMessages>
                            <BusinessErrors/>
                            <BusinessWarnings/>
                            <BusinessGenericMessages/>
                        </BusinessMessages>
                        <requestedTransSuccessfulInd>true</requestedTransSuccessfulInd>
                        <modifySuccessfulInd>false</modifySuccessfulInd>
                        <copySuccessfulInd>false</copySuccessfulInd>
                        <responseXMLString>
                            <RejectPolicyRes>
                                <status>Success</status>
                                <message>Reject Policy successful</message>
                            </RejectPolicyRes>
                        </responseXMLString>
                    </TFGCPLResultXMLDO>
                ]]>
            </out>
        </rejectQuoteXMLResponse>
    </soap:Body>
</soap:Envelope>

所需输出:

<QuoteRejectRs>
    <UserId>344758</UserId>
    <QuoteDetails>
        <QuoteNumber>PA-Q450000</QuoteNumber>
        <Status>Success</Status>
        <Message>Reject Policy successful</Message>
    </QuoteDetails>
</QuoteRejectRs>

XSLT 转换代码:

<!-- <xsl:stylesheet
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:xs="http://www.w3.org/2001/XMLSchema"
xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/"
xmlns:md1="http://http://xxx.group.com" xmlns:exsl="http://exslt.org/common" 
    exclude-result-prefixes="xs md1"
    extension-element-prefixes="exsl"
    version="2.0"> -->
<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="xml" indent="yes"/>
    <xsl:template match="/">
        <!--XML Response for Quote Reject which tell request has been submitted with success or fail -->
        <QuoteRejectRs>
            <UserId></UserId>
            <QuoteDetails>
                <QuoteNumber></QuoteNumber>
                <Status>
                    <xsl:value-of select="substring-before(substring-after(.,'Envelope/Body/TFGCPLResultXMLDO&gt;'), '&lt;Envelope/Body/TFGCPLResultXMLDO/responseXMLString/RejectPolicyRes/status')"/>
                </Status>
                <Message>
                    <xsl:value-of select="substring-before(substring-after(.,'Envelope/Body/TFGCPLResultXMLDO&gt;'), '&lt;Envelope/Body/TFGCPLResultXMLDO/responseXMLString/RejectPolicyRes/message')"/>
                </Message>
                <!--  <Status><xsl:value-of select="soap:Envelope/soap:Body/md1:rejectQuoteXMLResponse/md1:out/md1:status"/></Status><Message><xsl:value-of select="Envelope/Body/TFGCPLResultXMLDO/responseXMLString/RejectPolicyRes/message"/></Message>-->
            </QuoteDetails>
        </QuoteRejectRs>
    </xsl:template>
</xsl:stylesheet>

我已尝试并能够转换包含命名空间 (soap:xxx) 的 xml,但无法转换包含 CDATA 的 xml。

我已经尝试过,但得到的响应包含 < >格式。

所以任何人都知道此类任务的解决方案。

【问题讨论】:

标签: xslt soap xslt-1.0 xslt-2.0 cdata


【解决方案1】:

你抱怨你是

得到包含 < 的响应>格式。

这很容易解决。 xsl:value-of 有一个属性 disable-output-escaping 专门用于此目的,所以类似于

            <Status>
                <xsl:value-of
                    select="substring-before(substring-after(.,'Envelope/Body/TFGCPLResultXMLDO&gt;'), '&lt;Envelope/Body/TFGCPLResultXMLDO/responseXMLString/RejectPolicyRes/status')"
                    disable-output-escaping="yes"/>
            </Status>
            <Message>
                <xsl:value-of
                    select="substring-before(substring-after(.,'Envelope/Body/TFGCPLResultXMLDO&gt;'), '&lt;Envelope/Body/TFGCPLResultXMLDO/responseXMLString/RejectPolicyRes/message')"
                    disable-output-escaping="yes"/>
            </Message>

应该做你正在寻找的工作。

但是,我敦促您采取不同的方法。通过字符串函数分离和解析 XML 文本是个坏消息。您真正应该做的是将嵌入的 XML 解析为 XML 文档,然后转换 that。不幸的是,XSLT 1.0 和 2.0 没有为此提供标准机制,但一些实现将其添加为扩展,并且根据您执行转换的方式,安装您自己的扩展功能可能相对容易。或者,您可以提取嵌入的 XML 作为初步步骤,然后对其进行转换。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-05-24
    • 1970-01-01
    • 1970-01-01
    • 2021-02-28
    • 1970-01-01
    • 2020-02-05
    • 2017-11-09
    • 2022-11-30
    相关资源
    最近更新 更多