2013-02-05 97 views
1

我有一個SOAP請求,我試圖用XSLT進行轉換。我想將名稱空間限定符添加到請求中的每個元素。有兩種不同的名稱空間需要我需要用戶。下面是我想變換分析的XML:使用XSLT將多個名稱空間添加到SOAP XML消息

<soapenv:Envelope xmlns:soapenv="http://www.w3.org/2003/05/soap-envelope" > 
    <soapenv:Header/> 
    <soapenv:Body> 
     <PingRq> 
     <RqUID>1</RqUID> 
     <RequestContext> 
       <ClientUserID>1</ClientUserID> 
       <ClientName>Big Company</ClientName> 
       <ClientApplication> 
        <AppName>TestApp</AppName> 
        <AppVersion>1</AppVersion> 
       </ClientApplication> 
       <ClientLangPref>En-US</ClientLangPref> 
       <ClientDt>Mar-29-2013</ClientDt> 
     </RequestContext> 
     </PingRq> 
     </soapenv:Body> 
    </soapenv:Envelope 

下面是我想將它轉換成什麼:

<soapenv:Envelope xmlns:soapenv="http://www.w3.org/2003/05/soap-envelope" > 
     <soapenv:Header/> 
     <soapenv:Body> 
     <PingRq namespace="http://www.ns1.com"> 
     <RqUID namespace="http://www.ns2.com">1</RqUID> 
     <RequestContext namespace="http://www.ns2.com"> 
       <ClientUserID namespace="http://www.ns2.com">1</ClientUserID> 
       <ClientName namespace="http://www.ns2.com">Big Company</ClientName> 
       <ClientApplication namespace="http://www.ns2.com"> 
        <AppName namespace="http://www.ns2.com">TestApp</AppName> 
        <AppVersion namespace="http://www.ns2.com">1</AppVersion> 
       </ClientApplication> 
       <ClientLangPref namespace="http://www.ns2.com">En-US</ClientLangPref> 
       <ClientDt namespace="http://www.ns2.com">Mar-29-2013</ClientDt> 
     </RequestContext> 
     </PingRq> 
     </soapenv:Body> 
    </soapenv:Envelope> 

,這裏是我的樣式表

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="2.0" 
    xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/"> 

     <xsl:template match="@*|node()"> 
     <xsl:copy> 
     <xsl:apply-templates select = "@*|node()" /> 
     </xsl:copy> 
    </xsl:template>     

    <xsl:template match="PingRq"> 
    <xsl:element name="{local-name()}" namespace="http://www.ns1.com"> 
     <xsl:apply-templates select="@* | node()"/> 
    </xsl:element> 
    </xsl:template> 
    <xsl:template match="PingRq/*"> 
    <xsl:element name="{local-name()}" namespace="http://www.ns2.com"> 
     <xsl:apply-templates select="@*|node()"/> 
    </xsl:element> 
    </xsl:template>   
    </xsl:stylesheet> 

這裏是我得到的結果。

<?xml version="1.0" encoding="UTF-8"?> 
    <soapenv:Envelope xmlns:soapenv="http://www.w3.org/2003/05/soap-envelope"> 
     <soapenv:Header/> 
     <soapenv:Body> 
     <PingRq xmlns="http://www.ns1.com"> 
     <RqUID xmlns="http://www.ns2.com">1</RqUID> 
     <RequestContext xmlns="http://www.ns2.com"> 
       <ClientUserID xmlns="">1</ClientUserID> 
       <ClientName xmlns="">Big Company</ClientName> 
       <ClientApplication xmlns=""> 
        <AppName>TestApp</AppName> 
        <AppVersion>1</AppVersion> 
       </ClientApplication> 
       <ClientLangPref xmlns="">En-US</ClientLangPref> 
       <ClientDt xmlns="">Mar-29-2013</ClientDt> 
     </RequestContext> 
     </PingRq> 
     </soapenv:Body> 
     </soapenv:Envelope> 

我不明白爲什麼我會得到後代中的空名稱空間屬性。任何人有任何想法?

回答

1

PingRq/* xpath僅匹配PingRq元素的直接子元素。把所有的後代元素在一定的命名空間,你可以這樣做:

<xsl:template match="PingRq//*"> 
    <xsl:element name="{local-name()}" namespace="http://www.ns2.com"> 
    <xsl:apply-templates select="@*|node()"/> 
    </xsl:element> 
</xsl:template> 

注意,結果不顯示在所有的子孫命名空間聲明:

<soapenv:Envelope xmlns:soapenv="http://www.w3.org/2003/05/soap-envelope"> 
    <soapenv:Header /> 
    <soapenv:Body> 
    <PingRq xmlns="http://www.ns1.com"> 
     <RqUID xmlns="http://www.ns2.com">1</RqUID> 
     <RequestContext xmlns="http://www.ns2.com"> 
     <ClientUserID>1</ClientUserID> 
     <ClientName>Big Company</ClientName> 
     <ClientApplication> 
      <AppName>TestApp</AppName> 
      <AppVersion>1</AppVersion> 
     </ClientApplication> 
     <ClientLangPref>En-US</ClientLangPref> 
     <ClientDt>Mar-29-2013</ClientDt> 
     </RequestContext> 
    </PingRq> 
    </soapenv:Body> 
</soapenv:Envelope> 

但這是因爲RequestContext下的元素正在從其父項繼承其名稱空間。

+0

謝謝!我一直在看這幾天。我真的很感謝你的幫助! –

+0

而且我知道你可能在想什麼 - 所有這些麻煩在一個小斜線。 :) 樂意效勞。 – JLRishe

相關問題