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

sar*_*ari 5 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>
</prefix:request>
Run Code Online (Sandbox Code Playgroud)

预期输出:

<prefix:request xmlns:prefix="urn1" xmlns:foo2="urn2">
<element1>version1</element1>
<element2 xsi:type="prefix:requestA"/>
...
</element1>
</prefix:request>
Run Code Online (Sandbox Code Playgroud)

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

Dim*_*hev 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>
Run Code Online (Sandbox Code Playgroud)

当应用于(严重格式错误且必须更正)提供的类似 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>
Run Code Online (Sandbox Code Playgroud)

产生想要的正确结果

<prefix:request xmlns:prefix="urn1" xmlns:xsi="Undefined !!!" xmlns:foo2="urn2">
   <element1>version1</element1>
   <element2 xsi:type="prefix:requestA"/> ...  
</prefix:request>
Run Code Online (Sandbox Code Playgroud)