XSLT 添加了不必要的名称空间,如何摆脱它们?

XSLT adds unnecessary namespaces, how to get rid of them?

我处理这个 XML 文件:

<z/>

通过此 XSLT 2.0 样式表:

<xsl:stylesheet
  xmlns:xsl = "http://www.w3.org/1999/XSL/Transform"
  xmlns = "http://www.w3.org/1999/xhtml"
  xmlns:html = "http://www.w3.org/1999/xhtml"
  xmlns:data = "http://portonvictor.org/ns/misc"
  version = "2.0"
  exclude-result-prefixes = "data html">

  <xsl:template match="/">
    <xsl:variable name="x">
      <data:doc>
        <xsl:copy-of select="*"/>
      </data:doc>
    </xsl:variable>
    <xsl:copy-of select="$x/*/*"/>
  </xsl:template>

</xsl:stylesheet>

命令行:

saxonb-xslt -xsl:error.xslt -s:error.xml

结果输出为:

<?xml version="1.0" encoding="UTF-8"?><z xmlns:data="http://portonvictor.org/ns/misc"/>

它包含不必要的 xmlns:data 命名空间(尽管我有 exclude-result-prefixes)。摆脱这些不必要的名称空间的简单方法是什么?

上面的玩具示例是一个简化的 real code of my free program,我在其中分几个阶段处理输入的 XHTML 文件,首先创建 <data:doc> 个元素,然后再处理它们。

嗯,您的 $x 变量包含 xmlns:data="http://portonvictor.org/ns/misc" 命名空间中的一个元素 - 您复制的元素是该元素的后代。

当您复制一个元素时,您也复制了该元素范围内的所有命名空间。

如果您更改:

,您会看到不同的结果
<xsl:copy-of select="$x/*/*"/>

至:

<xsl:copy-of select="$x/*/*" copy-namespaces="no"/>

不确定这对您的实际问题的适用程度。