2011-08-11 69 views
3

我有一个XML文件,它具有默认名称空间和空名称空间,这些名称空间需要被删除,同时保留名称空间的其余部分。如何删除默认名称空间并使用XSLT保留其余的名称空间?

输入:

<prefix:request xmlns:prefix="urn1" xmlns:foo2="urn2" xmlns="urn1"> 
<element1 xmlns="">version1</element1> 
<element2 xsi:type="prefix:requestA" xmlns=""/> 
... 
</element1> 
</prefix:request> 

预期输出:用于去除命名空间将过滤掉所有名称空间,包括前缀

<prefix:request xmlns:prefix="urn1" xmlns:foo2="urn2"> 
<element1>version1</element1> 
<element2 xsi:type="prefix:requestA"/> 
... 
</element1> 
</prefix:request> 

XSLT样品。任何想法如何解决这个特殊情况?

+0

良好问题,+1。看到我的答案为非常短(迄今最短)和简单的解决方案:) –

回答

0

这短短的转变应用:

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

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

当所施加的(严重畸形和具有要被校正)提供类似于XML的输入

<prefix:request xmlns:xsi="Undefined !!!" 
xmlns:prefix="urn1" xmlns:foo2="urn2" 
xmlns="urn1"> 
    <element1 xmlns="">version1</element1> 
    <element2 xsi:type="prefix:requestA" xmlns=""/> ... 
</prefix:request> 

产生想要的,正确的结果

<prefix:request xmlns:prefix="urn1" xmlns:xsi="Undefined !!!" xmlns:foo2="urn2"> 
    <element1>version1</element1> 
    <element2 xsi:type="prefix:requestA"/> ... 
</prefix:request> 
+0

@sari:你的意思是你在你的问题中提供的XML文档上应用我的转换时遇到这个错误?如果是这样,这意味着您正在使用有缺陷的工具,不符合要求的工具。最好的办法是停止使用它。有几个很好的XSLT开发人员工具和XSLT处理器。在Java世界中,人们使用撒克逊。许多开发人员使用oXygen作为他们的XSLT IDE。 –

+0

谢谢。到目前为止,所提供的转换在Jdeveloper XSLT工具中不起作用;(。生成了一个错误“XML-23049:FOTY0021:invalid node type”。我尝试了更简单的脚本,就像从XML输入中移除所有命名空间一样。 ,没有错误,但在输出的根元素中有一个空的名称空间,就像这个xmlns =“”。这也是不想要的结果。 – sari

+0

这是正确的,我也得到了“无效节点类型”的错误也为这篇文章的第一个答案。感谢您的建议,似乎我现在必须转移到另一个工具,在修复时会在这里发布 – sari

1

那么您发布的代码片段甚至不是格式良好的XML,因此很难说明您想要实现什么,因为第二个结束</element1>没有任何相应的开始标记,并且前缀xsi已被使用但从未宣布。

但是假设你有

<prefix:request xmlns:prefix="urn1" xmlns:foo2="urn2" xmlns="urn1" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> 
<element1 xmlns="">version1</element1> 
<element2 xsi:type="prefix:requestA" xmlns=""/> 

</prefix:request> 

那么样式表

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

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

    <xsl:template match="@* | text() | comment() | processing-instruction()"> 
    <xsl:copy/> 
    </xsl:template> 

</xsl:stylesheet> 

当撒克逊6.5.5将输出

<?xml version="1.0" encoding="utf-8"?><prefix:request xmlns:prefix="urn1" xmlns:foo2="urn2" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> 
<element1>version1</element1> 
<element2 xsi:type="prefix:requestA"/> 

</prefix:request> 
+0

是的,你的假设是正确的,谢谢!现在,当在JDeveloper中介XSLT 1.0中测试您的脚本时,我得到错误。它表示定义的XSL与有效载荷不匹配,或者有效载荷无效;那么它说无效的节点类型。但是,所讨论的有效载荷完全可以通过XSLT脚本进行转换,以移除所有命名空间。这里有什么可能是错的? – sari

+0

对不起,我不知道JDeveloper调解器,所以我无法帮助解释它的错误消息。 –

相关问题