xslt - XSL - 复制元素但删除未使用的命名空间

标签 xslt xml-namespaces

我有一些 XML 声明了一个仅用于属性的命名空间,如下所示:

<?xml version="1.0" encoding="UTF-8"?>
<a xmlns:x="http://tempuri.com">
    <b>
        <c x:att="true"/>
        <d>hello</d>
    </b>
</a>

我想使用 XSL 创建所选节点及其值的副本 - 摆脱属性。所以我想要的输出是:
<?xml version="1.0" encoding="UTF-8"?>
<b>
    <c />
    <d>hello</d>
</b>

我有一些 XSL 几乎可以做到这一点,但我似乎无法阻止它将命名空间声明放在输出的顶级元素中。我的 XSL 是:
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
    <xsl:template match="/">
        <xsl:apply-templates select="/a/b"/>
    </xsl:template>

    <xsl:template match="node()">
        <xsl:copy>
            <xsl:apply-templates select="node()"/>
        </xsl:copy>
    </xsl:template>
</xsl:stylesheet>

输出的第一个元素是 <b xmlns:x="http://tempuri.com">而不是 <b> .我尝试在 XSL 中声明命名空间并将前缀放在 exclude-result-prefixes 中列表,但这似乎没有任何效果。我究竟做错了什么?

更新:我发现通过在 XSL 中声明命名空间并使用 extension-element-prefixes属性有效,但这似乎不对!我想我可以使用它,但我想知道为什么 exclude-result-prefixes不工作!

更新:实际上,这似乎是 extension-element-prefixes解决方案仅适用于 XMLSpy 的内置 XSLT 引擎,不适用于 MSXML。

最佳答案

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0"
    xmlns:x="http://tempuri.com">
    <xsl:template match="/">
        <xsl:apply-templates select="/a/b"/>
    </xsl:template>

    <xsl:template match="*">
        <xsl:element name="{local-name(.)}">
            <xsl:apply-templates/>
        </xsl:element>
    </xsl:template>

    <xsl:template match="@*">
        <xsl:copy/>
    </xsl:template>

    <!-- This empty template is not needed.
Neither is the xmlns declaration above:
    <xsl:template match="@x:*"/> -->
</xsl:stylesheet>

我找到了解释here .

Michael Kay wrote:
exclude-result-prefixes only affects the namespaces copied from the stylesheet by a literal result element, it doesn't affect copying of namespaces from source documents.

关于xslt - XSL - 复制元素但删除未使用的命名空间,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1074767/

相关文章:

xml - 如何使用冒号解码 xml 元素

xml - 如何在另一个 XSD 中使用命名空间定义的类型? (通过命名空间引用它)

c# - 为什么 XML 序列化程序在使用 namespace 的对象反序列化时返回 null?

xml - XML 命名空间名称 URI 必须是可检索的吗?

xml - XSL如何计算相同的节点名称?

javascript - 如何在 URL 中请求不带 'callback' 的 jsonp

xslt - 选择其他引用的元素的值

java - 如何使用 Java 从具有多个 namespace 的 XML 中获取特定节点?

regex - XSLT - 检查元素字符串中是否存在模式

regex - 使用 xslt 将简单的 markdown(string) 转换为 html