代码之家  ›  专栏  ›  技术社区  ›  gtx911

XSLT-将名称空间添加到节点XML

  •  0
  • gtx911  · 技术社区  · 8 年前

    我有一个简单的 XML :

    <RequestResponse>
        <RequestResult>
            <FinalResponse>
                <Message>Request inserted successfully.</Message>
                <Response>true</Response>
            </FinalResponse>
        </RequestResult>
    </RequestResponse>
    

    我使用 XSLT 包括 最终响应 变成 CDATA (字符串):

    <RequestResponse>    
        <RequestResult>
            <![CDATA[<FinalResponse>      
                    <Message>Request inserted successfully.</Message>
                    <Response>true</Response>   
            </FinalResponse>]]>
        </RequestResult>   
    </RequestResponse>
    

    然后我用另一个 XSLT 更多转换 XML SOAP 使用我想要的名称空间:

    <?xml version="1.0" encoding="UTF-8"?>
    <s:Envelope xmlns:s="http://schemas.xmlsoap.org/soap/envelope/">
        <s:Body>
            <RequestResponse>
                <RequestResult>
                    <![CDATA[
                    <FinalResponse>
                    <Message>Request inserted successfully.</Message>
                    <Response>true</Response>
                    </FinalResponse>
                    ]]>
                </RequestResult>
            </RequestResponse>
        </s:Body>
    </s:Envelope>
    

    我需要添加此标记/名称空间: xmlns="http://tempuri.org/" RequestResponse 节点,但是 只有 像这样的节点:

    <?xml version="1.0" encoding="UTF-8"?>
    <s:Envelope xmlns:s="http://schemas.xmlsoap.org/soap/envelope/">
        <s:Body>
            <RequestResponse xmlns="http://tempuri.org/">
                <RequestResult>
                    <![CDATA[
                    <FinalResponse>
                    <Message>Request inserted successfully.</Message>
                    <Response>true</Response>
                    </FinalResponse>
                    ]]>
                </RequestResult>
            </RequestResponse>
        </s:Body>
    </s:Envelope>
    

    如何仅将该元素添加到该节点?

    1 回复  |  直到 8 年前
        1
  •  2
  •   Martin Honnen    8 年前

    XSLT样式表( http://xsltransform.net/bwdws2 )

    <xsl:transform xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="2.0">
    
        <xsl:output cdata-section-elements="RequestResult" xmlns="http://tempuri.org/"/>
    
        <xsl:template match="@*|node()">
            <xsl:copy>
                <xsl:apply-templates select="@*|node()"/>
            </xsl:copy>
        </xsl:template>
    
        <xsl:template match="RequestResponse | RequestResponse//*">
            <xsl:element name="{name()}" namespace="http://tempuri.org/">
              <xsl:apply-templates select="@* | node()"/>            
            </xsl:element>
        </xsl:template>
    
    </xsl:transform>
    

    变换

    <s:Envelope xmlns:s="http://schemas.xmlsoap.org/soap/envelope/">
        <s:Body>
            <RequestResponse>
                <RequestResult>
                    <![CDATA[
                    <FinalResponse>
                    <Message>Request inserted successfully.</Message>
                    <Response>true</Response>
                    </FinalResponse>
                    ]]>
                </RequestResult>
            </RequestResponse>
        </s:Body>
    </s:Envelope>
    

    进入

    <s:Envelope xmlns:s="http://schemas.xmlsoap.org/soap/envelope/">
        <s:Body>
            <RequestResponse xmlns="http://tempuri.org/">
                <RequestResult><![CDATA[
    
                    <FinalResponse>
                    <Message>Request inserted successfully.</Message>
                    <Response>true</Response>
                    </FinalResponse>
    
                ]]></RequestResult>
            </RequestResponse>
        </s:Body>
    </s:Envelope>