2012-10-05 108 views
1
<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/"> 
    <soapenv:Body> 
     <tns:send xmlns:tns="http://www.test.com/Service/v3"> 
     <NS2:Message release="006" version="010" xmlns:NS2="http://www.ncpdp.org/schema/SCRIPT"> 

      <NS2:Body> 
       <NS2:New> 
        <NS2:Pharmacy> 
        <NS2:Identification> 
         <NS2:ID> 
          <NS2:IDValue>01017</NS2:IDValue> 
          <NS2:IDQualifier>94</NS2:IDQualifier> 
          <NS2:IDRegion>SCA</NS2:IDRegion> 
          <NS2:IDState>CA</NS2:IDState> 
         </NS2:ID> 
          </NS2:Identification> 
          </NS2:Pharmacy> 
        </NS2:New> 
      </NS2:Body> 
     </NS2:Message> 
     </tns:send> 
    </soapenv:Body> 
</soapenv:Envelope> 

我有這個模式版本爲3.0的xml http://www.test.com/Service/v3。我需要將其降級到版本1 http://www.test.com/Service/v1。要做到這一點,我使用XSL來轉換它。命名空間的XSLT轉換

 <?xml version="1.0" encoding="ISO-8859-1"?> 
     <xsl:stylesheet version="2.0" 
      xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
      xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/" 
      xmlns:booga="http://schemas.xmlsoap.org/wsdl/" 
      xmlns:tns="http://www.test.com/Service/v3" 
      xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" 
      xmlns:src="http://www.ncpdp.org/schema/SCRIPT" 
     > 


     <xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/> 

     <xsl:strip-space elements="*"/> 


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

      </xsl:copy> 

     </xsl:template> 

     <xsl:template match="tns:*"> 
      <!-- Output a new element in the new namespace --> 
      <xsl:element name="tns:{local-name()}" namespace="http://www.test.com/Service/v1"> 
       <!-- Copy all child attributes and nodes 
      <xsl:apply-templates select="node()|@*"/> --> 
      <xsl:apply-templates /> 
      </xsl:element> 
      </xsl:template> 

     </xsl:stylesheet> 

,但我得到這樣

<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/"> 
    <soapenv:Body> 
     <tns:send xmlns:tns="http://www.test.com/Service/v3"> 
     <NS2:Message release="006" version="010" xmlns:NS2="http://www.ncpdp.org/schema/SCRIPT" xmlns:tns="http://www.test.com/Service/v3"> 

      <NS2:Body> 
       <NS2:New> 
        <NS2:Pharmacy> 
        <NS2:Identification> 
         <NS2:ID> 
          <NS2:IDValue>01017</NS2:IDValue> 
          <NS2:IDQualifier>94</NS2:IDQualifier> 
          <NS2:IDRegion>SCA</NS2:IDRegion> 
          <NS2:IDState>CA</NS2:IDState> 
         </NS2:ID> 
         </NS2:Identification> 
         </NS2:Pharmacy> 
        </NS2:New> 
      </NS2:Body> 
     </NS2:Message> 
     </tns:send> 
    </soapenv:Body> 
</soapenv:Envelope> 

在我的輸出XML結果我得到這個

<NS2:Message release="006" version="010" xmlns:NS2="http://www.ncpdp.org/schema/SCRIPT" xmlns:tns="http://eps.pdxinc.com/webservice/Rxservice/v3"> 

爲什麼這個加到NS2:Message

xmlns:tns="http://eps.pdxinc.com/webservice/Rxservice/v3 

它不存在輸入XML。

有一些我失蹤了。如果有人能指出這個問題,我會很感激。

我所尋找的輸出以創建如下:

<?xml version="1.0"?> 
<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/"> 
    <soapenv:Body> 
     <tns:send xmlns:tns="http://www.test.com/Service/v1"> 
      <NS2:Message release="006" version="010" xmlns:NS2="http://www.ncpdp.org/schema/SCRIPT" > 

       <NS2:Body> 
        <NS2:New> 
         <NS2:Pharmacy> 
          <NS2:Identification> 
           <NS2:ID> 
            <NS2:IDValue>01017</NS2:IDValue> 
            <NS2:IDQualifier>94</NS2:IDQualifier> 
            <NS2:IDRegion>SCA</NS2:IDRegion> 
            <NS2:IDState>CA</NS2:IDState> 
           </NS2:ID> 
          </NS2:Identification> 
         </NS2:Pharmacy> 
        </NS2:New> 
       </NS2:Body> 
      </NS2:Message> 
     </tns:send> 
    </soapenv:Body> 
</soapenv:Envelope> 

我申請在NS2:Message是增加一個額外的命名空間xmlns:tns="http://www.test.com/Service/v3的XSL文件。

Orginally的標籤是:

<NS2:Message release="006" version="010" xmlns:NS2="http://www.ncpdp.org/schema/SCRIPT"> 

後我申請XSL將其改爲:

<NS2:Message release="006" version="010" xmlns:NS2="http://www.ncpdp.org/schema/SCRIPT" xmlns:tns="http://www.test.com/Service/v3> 

我不知道什麼地方獲取添加這個命名空間。

我只想要將xmlns:tns="http://www.test.com/Service/v3轉換爲xmlns:tns="http://www.test.com/Service/v3tns:send標記。

+0

客戶,你忘了展現確切想要的結果。請編輯問題並指定這些缺失和重要的信息。 –

+0

另外,提供的XML不是格式良好的XML文檔。請改正。 –

+0

我編輯了這個問題,並添加了我期待的輸出xml,XML現在已經很好地形成了。抱歉,添麻煩了。 – Guest

回答

2

嘗試......

XML輸入

<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/"> 
    <soapenv:Body> 
     <tns:send xmlns:tns="http://www.test.com/Service/v3"> 
      <NS2:Message release="006" version="010" xmlns:NS2="http://www.ncpdp.org/schema/SCRIPT"> 

       <NS2:Body> 
        <NS2:New> 
         <NS2:Pharmacy> 
          <NS2:Identification> 
           <NS2:ID> 
            <NS2:IDValue>01017</NS2:IDValue> 
            <NS2:IDQualifier>94</NS2:IDQualifier> 
            <NS2:IDRegion>SCA</NS2:IDRegion> 
            <NS2:IDState>CA</NS2:IDState> 
           </NS2:ID> 
          </NS2:Identification> 
         </NS2:Pharmacy> 
        </NS2:New> 
       </NS2:Body> 
      </NS2:Message> 
     </tns:send> 
    </soapenv:Body> 
</soapenv:Envelope> 

XSLT 1.0(或2.0,如果您更改版本)

編輯:改變 「TNS」前綴爲「djh」以說明前綴無關緊要。)

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
    xmlns:djh="http://www.test.com/Service/v3" 
    xmlns:NS2="http://www.ncpdp.org/schema/SCRIPT" 
    xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/"> 
    <xsl:output indent="yes"/> 
    <xsl:strip-space elements="*"/> 

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

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

    <xsl:template match="*"> 
     <xsl:element name="{name()}"> 
      <xsl:apply-templates select="@*|node()"/> 
     </xsl:element>  
    </xsl:template> 

</xsl:stylesheet> 

XML輸出

<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/"> 
    <soapenv:Body> 
     <tns:send xmlns:tns="http://www.test.com/Service/v1"> 
     <NS2:Message xmlns:NS2="http://www.ncpdp.org/schema/SCRIPT" release="006" version="010"> 
      <NS2:Body> 
       <NS2:New> 
        <NS2:Pharmacy> 
        <NS2:Identification> 
         <NS2:ID> 
          <NS2:IDValue>01017</NS2:IDValue> 
          <NS2:IDQualifier>94</NS2:IDQualifier> 
          <NS2:IDRegion>SCA</NS2:IDRegion> 
          <NS2:IDState>CA</NS2:IDState> 
         </NS2:ID> 
        </NS2:Identification> 
        </NS2:Pharmacy> 
       </NS2:New> 
      </NS2:Body> 
     </NS2:Message> 
     </tns:send> 
    </soapenv:Body> 
</soapenv:Envelope> 
+0

真棒!我們在這裏實際做了什麼: Guest

+0

@Guest - 該模板與「tns:*'以外的其他元素匹配。通過匹配並使用'xsl:element',我們避免輸出其他任何xmlns。此外,'name()'包含原始的名稱空間前綴。 –

+1

+1很好的答案。稍微改進一下,使其成爲100%安全的就是將'*'的模板更改爲使用'@ namespace'並指定元素的'namespace-uri()':' '幾乎所有的XSLT引擎都會使用'@ name'中的名稱空間前綴,但不必按照規範。在XSLT 1.0中,「選擇用於將創建的元素作爲XML輸出的前綴時,XSLT處理器可以使用name屬性中指定的QName的前綴;但是,它們不需要這樣做。」 http://www.w3.org/TR/xslt/#element-element –