2010-08-12 64 views
10

因此,我有一個輸入文件在默認名稱空間(xmlns="companyURL")中使用我公司的名稱空間,但我希望我的輸出文件使用默認名稱空間(xmlns:cmp="companyURL")以外的其他名稱空間。所以我建立基於cmp命名我的文件,但後來我想複製一些內部元素:在XSL翻譯中更改XML文件的名稱空間

<xsl:element name="cmp:container"> 
    <xsl:for-each select="foo"> 
    <xsl:copy-of select="." /> 
    </xsl:for-each> 
</xsl:element> 

不幸的是,這樣做是定義的默認命名空間爲每個內部元素,使文件難以置信詳細而醜陋。簡單的例子:

來源

<foo xmlns="companyURL"> 
    <num1>asdf</num1> 
    <num2>ghjkl</num2> 
</foo> 

假作:

<cmp:container xmlns:cmp="companyURL"> 
    <num1 xmlns="companyURL">asdf</num1> 
    <num2 xmlns="companyURL">ghjkl</num2> 
</cmp:container> 

當然,companyURL又大又長的又醜,而且它在這兩個地方是相同的,所以我會更喜歡上面的結果只是以下內容:

<cmp:container xmlns:cmp="companyURL"> 
    <cmp:num1>asdf</cmp:num1> 
    <cmp:num2>ghjkl</cmp:num2> 
</cmp:container> 

有沒有簡單的方法來做到這一點,或者我應該將cmp命名空間下的所有東西都轉換爲默認的命名空間?如果可能,我寧願使用明確的命名空間命名,它有助於理解我的經驗中的XSLT。

+0

好問題(+1)。 – 2010-08-12 01:31:14

+0

*「希望我的輸出文件使用非默認名稱空間」* >>按照您的示例,更改前綴(或從默認值改爲前綴)並不意味着改變命名空間。儘管前綴不同,但從XML + NS的角度來看,元素將保持相同(localname +名稱空間不變)。 – Abel 2010-08-12 12:11:02

+0

我指的是標籤名稱前面的可見標識符。 – 2010-08-12 16:28:17

回答

10

這種轉變

<xsl:template match="*"> 
    <xsl:element name="cmp:{name()}" namespace="CompanyURL"> 
     <xsl:copy-of select="@*"/> 
     <xsl:apply-templates/> 
    </xsl:element> 
</xsl:template> 
<xsl:template match="/*"> 
    <cmp:container xmlns:cmp="CompanyURL"> 
     <xsl:copy-of select="@*"/> 
     <xsl:apply-templates/> 
    </cmp:container> 
</xsl:template> 
</xsl:stylesheet> 

所提供的XML文檔進行時:

<foo xmlns="companyURL"> 
    <num1>asdf</num1> 
    <num2>ghjkl</num2> 
</foo> 

產生想要的,正確的結果

<cmp:container xmlns:cmp="CompanyURL"> 
    <cmp:num1>asdf</cmp:num1> 
    <cmp:num2>ghjkl</cmp:num2> 
</cmp:container> 
+1

爲什麼在XSLT中有''? – 2010-08-12 16:26:19

+2

@ adam_0:這將複製元素的所有屬性。在你的具體例子中沒有屬性,但是如果我們想把這個代碼作爲一般的轉換器使用,它必須能夠正確地轉換所有文檔 - 包括其中包含具有屬性的元素的文檔。 – 2010-08-12 17:42:55

+0

我的XML模式指定不會有屬性,所以我猜可以離開這條線很好嗎? – 2010-08-12 17:53:35