命名空间的XSLT转换

时间:2012-10-05 23:39:30

标签: xml xslt

<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>

我有这个xml,它位于架构版本3.0 http://www.test.com/Service/v3上。我需要将其降级到版本1 http://www.test.com/Service/v1。为此,我使用XSL进行转换。

        <?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>

我正在应用的XSL文档是在xmlns:tns="http://www.test.com/Service/v3中添加额外的名称空间NS2:Message

标签上的标签是:

<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/v3标记中的tns:send

1 个答案:

答案 0 :(得分: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>