排除结果前缀不起作用

bad*_*son 1 xml xslt xml-namespaces

我正在尝试编写一个 xslt 转换,该转换在输出的根元素中不包含任何 @xmlns:* 属性。给定这个 xml :

<?xml version="1.0" encoding="UTF-8"?>
<jw:root xmlns:jw="http://lexisnexis.com/neptune/gtdttest/jw">
    <jw:a/>
    <b test="1">
        <c/>
    </b>
</jw:root>
Run Code Online (Sandbox Code Playgroud)

和这个样式表

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
    xmlns:xs="http://www.w3.org/2001/XMLSchema"
    version="2.0"
    xmlns:jw="http://namespace/test/jw" exclude-result-prefixes="jw">

<xsl:template match="node()|@*">
    <xsl:copy>

         <xsl:apply-templates select="node()|@*"/>
    </xsl:copy>
</xsl:template>

<xsl:template match="@test"/>

</xsl:stylesheet>
Run Code Online (Sandbox Code Playgroud)

我得到这个:

<?xml version="1.0" encoding="UTF-8"?>
<jw:root xmlns:jw="http://lexisnexis.com/neptune/gtdttest/jw">
    <jw:a/>
    <b>
        <c/>
    </b>
</jw:root>
Run Code Online (Sandbox Code Playgroud)

我尝试过 - 将 @exclude-result-prefixes 放在根模板上, - 不复制属性, - 不在身份模板中使用“复制”,而是使用 - 使用 #all

我在规范中读过,虽然我现在找不到它,但它<xsl:copy/>忽略了 @exclude-result-prefixes,并且其他东西也可以覆盖它。

有什么方法可以删除那些 @xmlns:[prefix] atts?ns 是在输出使用的 dtd 中定义的,这让我很困惑将它们放在那里。猜猜我将不得不单独通过java打开并以这种方式删除?

谢谢!

Mic*_*Kay 6

except-result-prefixes 属性 (a) 仅适用于文字结果元素,并且 (b) 仅消除未使用的命名空间-在元素或属性名称中使用的命名空间将始终在结果树中声明。

您想要实现的是将输入元素修改为位于不同的名称空间中。xsl:copy 无法做到这一点,它始终保持元素名称(命名空间 + 本地名称)完整。您需要使用创建一个新元素<xsl:element name="{local-name()}">

如果您为结果元素和属性指定正确的名称,则名称空间声明将自行处理。请记住,元素或属性的名称是 (namespace, localname) 对。