如何将XML格式转换为另一种格式?

时间:2016-05-25 14:58:45

标签: xml xslt

我有一个要求,我需要将XML消息的格式更改为另一种XML消息格式。

以下是需要转换的输入:

<soap:Envelope
xmlns:wsdl="http://ee.co.uk/customer/wsdl"
xmlns:soap="http://www.w3.org/2003/05/soap-envelope"
>
    <soap:Header>
        <Ids>
            <userId>11111</userId>
            <responsibilityId>234433</responsibilityId>
        </Ids>
        <requestId>123435</requestId>
        <Token>e34OahuMch0Pai0Nbhr0</Token>
    </soap:Header>
    <soap:Body>
        <wsdl:getPersonslip>
            <personId>34343</personId>
        </wsdl:getPersonslip>
    </soap:Body>

</soap:Envelope>

转换后应该如下所示:

<params>
<param dataType="java.lang.int">11111</param>
<param dataType="oracle.jbo.domain.Number">234433</param>
<param dataType="java.lang.Date">34343</param>
</params>

如何使用XSL实现这一目标?不知道从哪里开始。如果有人能对它提供任何明确的帮助。

我在这里用来转换的XSL是:

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0" 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
xmlns:dp="http://www.datapower.com/extensions" 
extension-element-prefixes="dp">
<xsl:output method="xml" />
    <xsl:template match="/">

        <params>
                <xsl:if test="/soap:Envelope/soap:Body/wsdl:getPersonslip/personId">
                    <param dataType="java.lang.Date">
                        <xsl:value-of select="/soap:Envelope/soap:Body/wsdl:getPersonslip/personId"/>
                    </param>
                </xsl:if>
        </params>
</xsl:template>


</xsl:stylesheet>

但它似乎没有正确打印。

1 个答案:

答案 0 :(得分:0)

如果不首先声明前缀,则不能使用soap:wsdl:等前缀。

尝试:

XSLT 1.0

<xsl:stylesheet version="1.0" 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:wsdl="http://ee.co.uk/customer/wsdl"
xmlns:soap="http://www.w3.org/2003/05/soap-envelope"
exclude-result-prefixes="wsdl soap">
<xsl:output method="xml" version="1.0" encoding="utf-8" indent="yes"/>    

<xsl:template match="/soap:Envelope">
    <params>
        <param dataType="java.lang.int">
            <xsl:value-of select="soap:Header/Ids/userId"/>
        </param>
        <param dataType="oracle.jbo.domain.Number">
            <xsl:value-of select="soap:Header/Ids/responsibilityId"/>
        </param>
        <param dataType="java.lang.Date">
            <xsl:value-of select="soap:Body/wsdl:getPersonslip/personId"/>
        </param>
    </params>
</xsl:template>

</xsl:stylesheet>