2016-10-05 68 views
3

由於某些原因,我需要更改現有的xml文件,並且我想使用xslt來完成此操作。我需要將一些名稱空間聲明從根節點移動到子節點。XSLT - 爲某些子項添加命名空間聲明

基本上我開始與文件看起來像這樣:

<env:Envelope xmlns:env="http://schemas.xmlsoap.org/soap/envelope/" 
xmlns:ns1="http://ns1" xmlns:ns2="http://ns2" xmlns:ns3="http://ns3"> 
<env:Header> 
    <ns1:parent11> 

     <ns1:child11>value</ns1:child11> 
     <ns1:child11>value</ns1:child11> 
     <ns1:child11>value</ns1:child11> 

     <ns1:child12> 
      <ns2:child21>value</ns2:child21> 
      <ns2:child22>value</ns2:child22> 
     </ns1:child12> 

    </ns1:parent11> 
</env:Header> 


<env:Body> 
    <ns3:parent31> 
     <ns3:child31>value</ns3:child31> 
     <ns3:child32>value</ns3:child32> 

     <ns3:child33> 
      <ns2:parent2> 
       <ns2:child23>value</ns2:child23> 
       <ns2:child23>value</ns2:child23> 
       <ns2:child23>value</ns2:child23> 
      </ns2:parent2> 
     </ns3:child33> 

    </ns3:parent31> 
</env:Body> 

我需要的是這樣結束:

<env:Envelope xmlns:env="http://schemas.xmlsoap.org/soap/envelope/" 
xmlns:ns1="http://ns1" xmlns:ns2="http://ns2" xmlns:ns3="http://ns3"> 
<env:Header> 
    <parent11 xmlns="http://ns1"> 

     <child11>value</child11> 
     <child11>value</child11> 
     <child11>value</child11> 

     <child12> 
      <ns2:child21>value</ns2:child21> 
      <ns2:child22>value</ns2:child22> 
     </child12> 

    </parent11> 
</env:Header> 


<env:Body> 

    <parent31 xmlns="http://ns3"> 
     <child31>value</child31> 
     <child32>value</child32> 

     <child33> 
      <parent2 xmlns="http://ns2"> 
       <child23>value</child23> 
       <child23>value</child23> 
       <child23>value</child23> 
      </parent2> 
     </child33> 

    </parent31> 
</env:Body> 

我是在xslt中完成新手(我選擇它是因爲我認爲這是正確的做法),所以我是stu在剛開始的時候,我甚至不知道如何開始。

+0

這個練習的目的是什麼? AFAICT,輸入和輸出在語義上是相同的。 –

回答

0

解XSLT 1.0/XSLT 2.0:

<?xml version="1.0" encoding="UTF-8"?> 
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
    xmlns:xs="http://www.w3.org/2001/XMLSchema" 
    xmlns:env="http://schemas.xmlsoap.org/soap/envelope/" 
    xmlns:ns1="http://ns1" 
    xmlns:ns2="http://ns2" 
    xmlns:ns3="http://ns3" 
    version="1.0"> 

    <xsl:template match="ns1:* | ns2:* | ns3:*"> 
     <xsl:element name="{local-name()}" namespace="{namespace-uri()}"> 
      <xsl:apply-templates/> 
     </xsl:element> 
    </xsl:template> 

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

</xsl:stylesheet> 

輸出:

<?xml version="1.0" encoding="UTF-8"?> 
<env:Envelope xmlns:env="http://schemas.xmlsoap.org/soap/envelope/" xmlns:ns1="http://ns1" 
    xmlns:ns2="http://ns2" xmlns:ns3="http://ns3"> 
    <env:Header> 
     <parent11 xmlns="http://ns1"> 

      <child11>value</child11> 
      <child11>value</child11> 
      <child11>value</child11> 

      <child12> 
       <child21 xmlns="http://ns2">value</child21> 
       <child22 xmlns="http://ns2">value</child22> 
      </child12> 

     </parent11> 
    </env:Header> 
    <env:Body> 
     <parent31 xmlns="http://ns3"> 
      <child31>value</child31> 
      <child32>value</child32> 

      <child33> 
       <parent2 xmlns="http://ns2"> 
        <child23>value</child23> 
        <child23>value</child23> 
        <child23>value</child23> 
       </parent2> 
      </child33> 

     </parent31> 
    </env:Body> 
</env:Envelope> 

描述:

上模板移除命名空間前綴 - 例如ns1 - 用於匹配元素。

對於所有其他元素,屬性和文本,第二個模板是標識副本

XSLT-Processors自己刪除同一名稱空間內子對象的名稱空間。