2011-04-20 102 views
7

這是我(簡化了這種情況)XML:如何擺脫的xmlns的= 「」(沒有命名空間)屬性在XSLT輸出

<?xml version="1.0" encoding="UTF-8"?> 
<?xml-stylesheet href="test_1.xsl" type="text/xsl"?> 

<doc xmlns="http://www.foo.org"> 
    <div> 
    <title>Mr. Title</title> 
    <paragraph>This is one paragraph. 
    </paragraph> 
    <paragraph>Another paragraph. 
    </paragraph> 
    </div> 
</doc> 

這裏是我的XSLT:

<?xml version="1.0" encoding="UTF-8"?> 
<xsl:stylesheet version="1.0" 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
xmlns:foo="http://www.foo.org"> 

<xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/> 

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

<xsl:template match="foo:doc"> 
    <xsl:element name="newdoc" namespace="http://www/w3.org/1999/xhtml"> 
    <xsl:apply-templates/> 
    </xsl:element> 
</xsl:template> 

<xsl:template match="foo:div"> 
    <segment title="{foo:title}"> 
    <xsl:apply-templates/> 
    </segment> 
</xsl:template> 

<xsl:template match="foo:title"> 
    <xsl:element name="h2"> 
    <xsl:apply-templates/> 
    </xsl:element> 
</xsl:template> 

<xsl:template match="foo:paragraph"> 
    <xsl:element name="p"> 
    <xsl:apply-templates/> 
    </xsl:element> 
</xsl:template> 

</xsl:stylesheet> 

的輸出產生這樣的:

<newdoc xmlns="http://www/w3.org/1999/xhtml"> 
    <segment xmlns="" title="Mr. Title"> 
    <h2>Mr. Title</h2> 
    <p>This is one paragraph. 
    </p> 
    <p>Another paragraph. 
    </p> 
    </segment> 
</newdoc> 

其是大的,除了的xmlns =「」在分割元素,這似乎是限定用於本身沒有命名空間和所有的孩子。我怎樣才能使它不會添加這個?

旁註:我也試圖與

<xsl:template match="mydoc:doc"> 
    <html xmlns="http://www/w3.org/1999/xhtml"> 
    <xsl:apply-templates/> 
    </html> 
</xsl:template> 

,而不是將第一個節點,但它產生同樣的效果。

感謝幫助的人!

回答

11

好像你想放的輸出文檔中的所有元素融入到「HTTP:/ /www/w3.org/1999/xhtml「命名空間。目前,您只爲「newdoc」元素指定名稱空間,因爲樣式表中沒有名稱空間聲明,所有其他元素都位於默認名稱空間中。樣式表內的嵌套決定了元素屬於哪個名稱空間,而不是轉換後的嵌套。

您可以在樣式表聲明默認命名空間來影響所有否則爲不合格元素:

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

現在你也不再需要xsl:element標籤,並可以直接使用newdoc在正確的命名空間中創建一個元素。

+0

Örn:謝謝!像魅力一樣工作,我想我現在就明白了。 – Zori 2011-04-20 18:02:53

+0

這也適用於我,但答案中有一個錯字。答案是:http://www/w3.org ...'應該說'http://www.w3.org ...'。斜線應該是一個點。 – maddoxej 2012-09-25 20:14:26

4

foo:div模板中,您將創建一個segment元素,其空名稱空間。由於父元素具有不同的名稱空間,因此處理器必須添加此名稱空間聲明。

如果你想要的是一個segment具有相同的命名空間比母體,然後使用xsl:element代替:

<xsl:template match="foo:div"> 
    <xsl:element name="segment"> 
     <xsl:attribute name="title"> 
      <xsl:value-of select="foo:title"/> 
     </xsl:attribute> 
     <xsl:apply-templates/> 
    </xsl:element> 
</xsl:template>