删除特定元素的名称空间

问题描述:

是否有任何方法可以删除特定元素的名称空间?删除特定元素的名称空间

+0

好问题,+1。查看我的答案获得完整的解决方案。 – 2010-12-08 14:33:11

+0

请提供输入样本和所需输出。 – 2010-12-08 14:33:34

这种转变

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

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

<xsl:template match="x:*"> 
    <xsl:element name="{local-name()}"> 
    <xsl:copy-of select="namespace::*[not(. = namespace-uri(..))]"/> 
    <xsl:apply-templates select="node()|@*"/> 
    </xsl:element> 
</xsl:template> 
</xsl:stylesheet> 

"my:x"空间中移除任何元素,并把它变成 “没有命名空间”。

例如,当施加到下面的XML文档:

<t> 
    <x:a xmlns:x="my:x"/> 
</t> 

有用,正确的结果产生

<t> 
    <a/> 
</t> 

要从特定仅去除一个特定元件命名空间中,覆盖身份规则的模板必须更具体,以便仅匹配想要的元素

您的XSLT输出是一个全新的对象(节点或文本),您可以将每个元素复制或转换为一个没有名称空间的新元素。假设您的输入使用名称空间“http://www.foo/”。您可以创建没有名称空间的相同名称的元素(可能还有相同的子元素)。

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

<!-- other elements and root omitted --> 

    <xsl:template match="h:table"> 
     <table> 
     <!-- copy or transform attributes and children --> 
     </table> 
    </xsl:table> 

</xsl:stylesheet> 

将创建一个新的节点,其中不需要前缀的默认命名空间,我认为是你需要的。 [可能有更优雅的方式使用xsl:复制... -

更新:...和@Dmitri向他们展示了它们!