2016-09-30 89 views
0

Apologies.I看到了很多類似的問題,但不幸的是,其中大多數不適用於我。我的要求是 1)我必須使用XSLT爲根元素添加命名空間 2)我使用xsl:result-document從單個輸入生成多個XML文件。所有生成的文檔的根元素應該具有名稱空間。使用xslt將名稱空間僅添加到根元素

如果我嘗試以下解決方案,我會在我的所有子級別標記中獲得XMLNS。 如果我嘗試使用xsl:copy,我會從輸入XML中獲取標記,但我不想要,因爲我的輸出標記與我的輸入完全不同。

I/P:

<einfo> 
    <employee> 
     <eid>456</eid> 
     <firstname>def</firstname> 
     <lastname>y</lastname> 
    </employee> 
</einfo> 

我的XSLT:

<xsl:stylesheet version="2.0" 
       xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> 
    <xsl:output method="xml" indent="yes"/> 
    <xsl:strip-space elements="*"/> 
    <!-- Global Variables --> 
    <xsl:variable name="lcletters">abcdefghijklmnopqrstuvwxyz</xsl:variable> 
    <xsl:variable name="ucletters">ABCDEFGHIJKLMNOPQRSTUVWXYZ</xsl:variable> 
    <xsl:template match="einfo"> 
     <xsl:for-each select="employee"> 
      <xsl:variable name="docName" select="eid"/> 
      <xsl:result-document href="{$docName}"> 
      <xsl:element name="employee" namespace="myurl"> 
      <xsl:call-template 
        name="processEmployees"> 
       <xsl:with-param name="p_firstname" 
           select="firstname"/> 
       <xsl:with-param name="p_lastname" 
           select="lastname"/> 
      </xsl:call-template> 
      </xsl:element> 
      </xsl:result-document> 
     </xsl:for-each> 
    </xsl:template> 
    <xsl:template name="processEmployees"> 
     <xsl:param name="p_firstname"/> 
     <xsl:param name="p_lastname"/> 
     <xsl:element name="firstname"> 
      <xsl:value-of select="$p_firstname"/> 
     </xsl:element> 
     <xsl:element name="lastname"> 
      <xsl:value-of select="$p_lastname"/> 
     </xsl:element> 
    </xsl:template> 
    </xsl:stylesheet> 

實際輸出:

<?xml version="1.0" encoding="UTF-8"?> 
<employee xmlns="myurl"> 
    <firstname xmlns="">def</firstname> 
    <lastname xmlns="">y</lastname> 
</employee> 

預期輸出:我只需要根元素,即員工擁有的命名空間(XMLNS )。

+0

請張貼** **再現的例子,包括一個輸入端和一個** **完整(優選最小化)的樣式表 - 見:[MCVE]。 - 一般來說,你誤解了命名空間是如何工作的。默認的名稱空間是繼承的。如果您不希望'address'具有現在的重載無名稱空間聲明,則必須將它放在與其父'home'相同的名稱空間中。對於結果樹中的所有其他元素也是如此。 –

回答

0
I just need name space for tag and not for all the other child tag. 

你在命名空間節點和命名空間聲明之間混淆了。 xmlns =「」被添加到子元素,因爲在結果樹中,子元素與父元素位於不同的名稱空間中。如果你不想要xmlns =「」,這表明你實際上希望這個孩子和父代在同一個命名空間中。您沒有向我們展示processAdd模板,但是證據是它在沒有命名空間中創建地址,而應該在名稱空間myurl中創建地址。

+0

@ micheal.hor257k,Michael Kay,對不起,我感到困惑......我已經發布了i/p,xslt和輸出來解釋場景..hope這有助於.. –

0

你爲什麼不乾脆做:

XSLT 2.0

<xsl:stylesheet version="2.0" 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
<xsl:output method="xml" version="1.0" encoding="utf-8" indent="yes"/> 

<xsl:template match="/einfo"> 
    <xsl:for-each select="employee"> 
     <xsl:result-document href="{eid}"> 
      <employee xmlns="myurl"> 
       <firstname> 
        <xsl:value-of select="firstname" /> 
       </firstname> 
       <lastname> 
        <xsl:value-of select="lastname" /> 
       </lastname> 
      </employee> 
     </xsl:result-document> 
    </xsl:for-each> 
</xsl:template> 

</xsl:stylesheet> 

注:

乍一看,它可能看起來:

<firstname> 
    <xsl:value-of select="firstname" /> 
</firstname> 

可以縮短爲:

<xsl:copy-of select="firstname" /> 

然而,事實並非如此。樣式表中的文字結果元素<firstname>繼承其父代<employee xmlns="myurl">的名稱空間。寫作:

<employee xmlns="myurl"> 
    <firstname> 
     <xsl:value-of select="firstname" /> 
    </firstname> 

是完全一樣的文字:

<employee xmlns="myurl"> 
    <firstname xmlns="myurl"> 
     <xsl:value-of select="firstname" /> 
    </firstname> 

OTOH,如果你從源XML複製原始firstname元素,將其原始namesepace(無命名空間中複製這種情況下),並且將出現在輸出爲:

<firstname xmlns=""> 
相關問題