如何使用 XSLT 删除默认名称空间并保留其余名称空间? [英] How to remove default namespace and keep the rest of namespaces using XSLT?
本文介绍了如何使用 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屋!
查看全文