2012-05-16 240 views
1

我有XML我想要複製的是像(檢查的xmlns =「」和標籤。我想創建原樣。XSLT空白命名空間

總的計算是照顧。只有這個問題。它是有效的。仍然客戶希望預期的格式是這樣的。任何幫助非常感謝。 三項任務

1)我需要添加命名空間員工xmnls =「1.2」xmlns:xsi =「3」xsi:schemalocation =「4 2)在輸出xml中生成像這樣的標籤不是 3)需要避免xmlns =「」

任何幫助提前gr eatly讚賞 rameshkumar辛格

Input.xml中

<Employees> 
      <employee> 
      <dept>1</dept> 
       <sec></sec> 
      </employee> 
      <employee> 
       <dept>2</dept> 
       <sec></sec> 
      </employee> 
    </Employees> 

Expected.XML 

     <Employees xmnls="1.2" xmlns:xsi="3" xsi:schemalocation="4"> 
      <totalemp>2</totalemp> 
      <employee> 
       <dept>1</dept> 
       <sec></sec> 
      <employee> 
       <employee> 
        <dept>2</dept> 
        <sec></sec> 
       <employee> 
       </Employees> 


actual.XML 
       <Employees> 
        <totalemp>2</totalemp> 
         <employee xmlns=""> 
         <dept>1</dept> 
          <sec/> 
         </employee> 
         <employee> 
          <dept>2</dept> 
           <sec/> 
          <employee> 
       </Employees> 
+0

您可以直接生成正確的XML,而不是嘗試使用XSLT進行轉換嗎? (順便說一句,你的「移位」鍵似乎被打破,因爲句子有隨機大小寫) –

回答

2

這裏是你如何做到這一點:

<xsl:stylesheet version="1.0" 
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
    xmlns:xsi="3"> 

    <xsl:output indent="yes"/> 

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

    <xsl:template match="*" priority="2"> 
     <xsl:element name="{local-name()}" namespace="1.2"> 
      <xsl:if test="self::Employees"> 
       <xsl:attribute name="xsi:schemalocation">4</xsl:attribute>   
      </xsl:if> 
      <xsl:apply-templates select="@* | node()"/> 
     </xsl:element> 
    </xsl:template> 
</xsl:stylesheet> 

您應用的身份轉變爲默認值,然後重寫它的元素給他們提供了一個新的名稱空間以及Employees節點的特殊屬性。我選擇添加if聲明,但您也可以將該邏輯移入與Employees匹配的另一個模板。我只是不想重複整個xsl:element的事情兩次。味道真的很重要。

當我將此轉化爲您的輸入文檔我結束了:

<Employees xmlns="1.2" xmlns:xsi="3" xsi:schemalocation="4"> 
    <employee> 
     <dept>1</dept> 
     <sec/> 
    </employee> 
    <employee> 
     <dept>2</dept> 
     <sec/> 
    </employee> 
</Employees> 

你必須在你的結果可能是xmlns=""因爲你沒有重新創建在新的命名空間的所有元素。此外,爲了能夠添加xsi:schemalocation屬性,您需要在轉換文檔上聲明xsi命名空間。

0

這種短期和簡單的轉換(有模板的最小數量,並且不使用任何明確的XSLT條件指令,沒有xsl:attributepriority屬性):當所提供的XML文檔應用

<xsl:stylesheet version="1.0" 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
xmlns:xsi="3" xsi:schemalocation="4"> 
<xsl:output omit-xml-declaration="yes" indent="yes"/> 
<xsl:strip-space elements="*"/> 

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

<xsl:template match="*"> 
    <xsl:element name="{name()}" namespace="1.2"> 
    <xsl:copy-of select= 
    "document('')/*[not(current()/../..)] 
         /@xsi:schemalocation"/> 
    <xsl:apply-templates select="@*|node()"/> 
    </xsl:element> 
</xsl:template> 
</xsl:stylesheet> 

<Employees> 
    <employee> 
     <dept>1</dept> 
     <sec></sec> 
    </employee> 
    <employee> 
     <dept>2</dept> 
     <sec></sec> 
    </employee> 
</Employees> 

產生想要的,正確的結果:

<Employees xmlns="1.2" xmlns:xsi="3" xsi:schemalocation="4"> 
    <employee> 
     <dept>1</dept> 
     <sec/> 
    </employee> 
    <employee> 
     <dept>2</dept> 
     <sec/> 
    </employee> 
</Employees> 
+0

我預計結果爲 不是

+0

@RameshSingh:兩者是等價的。兩者都代表沒有孩子的「秒」元素。精確的詞彙表示不能在轉換中進行控制,而且通常在一個XSLT處理器與另一個XSLT處理器之間存在差異。如果這對你來說真的很重要,你可以通過以下方式欺騙XSLT處理器:'' –

+0

我不能欺騙它,在我的真實需求中,我有大約1000個這樣的xml標籤,我的客戶想用這種方式標籤。我得到xmlns =「」問題。我不知道如何一起處理這兩個問題 –