exclude-result-prefixes无效

时间:2018-01-12 03:31:51

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

和这个样式表

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

我得到了这个:

<?xml version="1.0" encoding="UTF-8"?>
<jw:root xmlns:jw="http://lexisnexis.com/neptune/gtdttest/jw">
    <jw:a/>
    <b>
        <c/>
    </b>
</jw:root>

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

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

以任何方式删除那些@xmlns:[prefix] atts? ns是在输出使用的dtd中定义的,它让我搞砸了。猜猜我将不得不用java打开一个单独的传递并删除那个方式?

谢谢!

3 个答案:

答案 0 :(得分:3)

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

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

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

答案 1 :(得分:0)

使用以下内容代替身份模板

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

如果您的源XML还具有名称空间的属性, 然后还添加以下模板:

<xsl:template match="@*">
  <xsl:attribute name="{local-name()}">
    <xsl:value-of select="."/>
  </xsl:attribute>
</xsl:template>

当然,只要你没有&#34; ovelapping&#34;这种方法就有效。元素/ 属性名称(与不同名称空间相同的名称)。

答案 2 :(得分:0)

copy-namespaces="no"使用xsl:copy-of

为我工作