如何使用 XSLT 删除默认名称空间并保留其余名称空间? [英] How to remove default namespace and keep the rest of namespaces using XSLT?

查看:30
本文介绍了如何使用 XSLT 删除默认名称空间并保留其余名称空间?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

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

输入:

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

预期输出:

<element1>version1</element1><element2 xsi:type="prefix:requestA"/>...</element1></prefix:request>

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

解决方案

这个简短的转变:

<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:模板></xsl:stylesheet>

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

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

产生想要的、正确的结果:

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

I have a XML file having default namespace and empty namespaces which need to be removed, while keeping the rest of namespaces.

Input:

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

Expected output:

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

XSLT sample for removing namespaces will filter out all namespaces, including the prefix. Any idea how to solve this particular case?

解决方案

This short transformation:

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

when applied on the (severely malformed and having to be corrected) provided XML-like input:

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

produces the wanted, correct result:

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

这篇关于如何使用 XSLT 删除默认名称空间并保留其余名称空间?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆