Xml 如何使用XSLT删除默认名称空间并保留其余名称空间?

Xml 如何使用XSLT删除默认名称空间并保留其余名称空间?,xml,xslt,xml-namespaces,Xml,Xslt,Xml Namespaces,我有一个XML文件,其中包含默认名称空间和需要删除的空名称空间,同时保留其余名称空间 输入: <prefix:request xmlns:prefix="urn1" xmlns:foo2="urn2" xmlns="urn1"> <element1 xmlns="">version1</element1> <element2 xsi:type="prefix:requestA" xmlns=""/> ... </element1> &l

我有一个XML文件,其中包含默认名称空间和需要删除的空名称空间,同时保留其余名称空间

输入:

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

版本1
...
预期产出:

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

版本1
...

用于删除名称空间的XSLT示例将过滤掉所有名称空间,包括前缀。你知道如何解决这个特殊情况吗?

你发布的代码片段甚至不是格式良好的XML,因此很难说出你想要实现什么,因为第二个结束
没有任何相应的开始标记,并且使用了前缀
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>

版本1
然后是样式表

<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>

与Saxon 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>

版本1

这个简短的转换

<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>
<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>

应用于(格式严重错误且必须更正)提供的类似XML的输入时

<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>
<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>

版本1
...  
生成所需的正确结果

<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>
<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>

版本1
...  

是的,您的假设是正确的,谢谢!现在,当在JDeveloper中介XSLT1.0中测试脚本时,我发现了一个错误。它说要么定义的XSL与负载不匹配,要么负载无效;然后它说节点类型无效。但是所讨论的有效负载可以通过XSLT脚本进行转换,以删除所有名称空间。这里可能有什么问题?抱歉,我不知道JDeveloper mediator,所以我无法解释它的错误消息。好问题,+1。请参阅我的答案,以获得一个非常简短(迄今为止最短)且简单的解决方案:)@sari:您的意思是在您的问题中提供的XML文档上应用我的转换时出现此错误吗?如果是这样,这意味着您使用的是有缺陷的工具,即不兼容的工具。最好的办法就是停止使用它。有几种很好的XSLT开发工具和XSLT处理器。在Java世界中,人们使用萨克森。许多开发人员使用氧气作为XSLT IDE。谢谢。到目前为止,给定的转换在Jdeveloper XSLT工具中不起作用;(.生成错误“XML-23049:FOTY0021:invalid node type”。我尝试了更简单的脚本,例如用于从XML输入中删除所有命名空间的脚本。该脚本正常工作,没有错误,但在输出根元素中有一个空命名空间,如此xmlns=“”。这也是不需要的结果。没错,我得到了“invalid node type”这篇文章的第一个答案也是错误的。谢谢你的建议,我现在似乎必须换一个工具。得到修复后,我会在这里发布。仅仅提供errmsg是不够的。必须有一个行号,在这个行号上引发了这个错误。无论如何,不要以同样的方式使用这个玩具,因为你不会使用坏了的自行车。