,這是非常簡單的實現:
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output omit-xml-declaration="yes"/>
<xsl:template match="/">
<xml:namespace prefix="vml" ns="urn:schemas-microsoft-com:vml"/>
</xsl:template>
</xsl:stylesheet>
這種轉變,當在任何XML文檔(未使用)被應用時產生的有用結果 :
<xml:namespace prefix="vml" ns="urn:schemas-microsoft-com:vml"/>
然而,在我看來,你想一個命名空間節點添加到給定的XML文檔中的每個元素(如果不是這樣,只是讓我通過commentand我會刪除該知道回答)。
如果是這樣,這裏是一個簡單且有效的方式:
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:vml="urn:schemas-microsoft-com:vml"
exclude-result-prefixes="vml">
<xsl:output omit-xml-declaration="yes" indent="yes"/>
<xsl:strip-space elements="*"/>
<xsl:variable name="vNamespace" select=
"document('')/*/namespace::*[name()='vml']"/>
<xsl:template match="node()|@*">
<xsl:copy>
<xsl:apply-templates select="node()|@*"/>
</xsl:copy>
</xsl:template>
<xsl:template match="/*">
<xsl:copy>
<xsl:copy-of select="$vNamespace"/>
<xsl:apply-templates select="node()|@*"/>
</xsl:copy>
</xsl:template>
</xsl:stylesheet>
當施加到任何文件,例如這一個:
<t>
<a x="3">
<b y="4"/>
</a>
</t>
有用結果產生:
<t xmlns:vml="urn:schemas-microsoft-com:vml">
<a x="3">
<b y="4"/>
</a>
</t>
由於只有結果的頂部元素明顯具有所需的名稱空間節點,因此這可能會使第一次看到時感到困惑。但是,根據定義(查看XML Namespace spec)如果(子)樹根上的元素具有給定的命名空間節點,則其所有的後代元素也都具有該命名空間節點。即使您將名稱空間複製到每個元素,XSLT序列化器也會從除頂部元素之外的所有元素的序列化(文本)表示中剝離它。
在XSLT 2.0則只需使用<xsl:namespace>
指令:
<xsl:namespace name="vml" select="urn:schemas-microsoft-com:vml"/>
難道我理解正確的話,你想一個命名空間節點添加到每個元素? – 2010-06-30 13:29:32
@Sawa:我必須說我與Dimitre有關,不鼓勵MS允許使用xml:namespace和其他非標準元素。更重要的是,這可以通過適當的命名空間聲明'xmlns:vml =「urn:schemas-microsoft-com:vml」' – 2010-06-30 18:52:47