xml - 如何删除默认 namespace 并使用 XSLT 保留其余 namespace ?

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

预期输出:

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

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

最佳答案

这个简短的转换:

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

关于xml - 如何删除默认 namespace 并使用 XSLT 保留其余 namespace ?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7023533/

相关文章:

c# - 以编程方式创建带有命名空间的 xml 属性

xslt - 如何使用 xslt 处理 xml 命名空间的存在与否

php - 引用 - 如何在 SimpleXML 中处理命名空间(名称中带有冒号的标签和属性)?

xml - XPath 查询通过某种实现来选择元素

XML 回车符在发布后消失了

java - 使用 xslt 将一个 xml 的内容复制到另一个 xml 中

xml - 在 Umbraco 中使用 XSLT 从 Xml 中选择前 X 个项目

xml - 是否可以使 Tokenizer 命名空间感知(使用 Splitter 时)

python - 如何使用ElementTree按属性值查找xml元素

xslt - 如何使用 xslt 将 json 转换为 xml