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

时间:2016-05-25 21:57:09

标签: xml xslt xslt-2.0 xml-namespaces

我处理这个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>元素,然后处理它们。

1 个答案:

答案 0 :(得分:1)

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

复制元素时,还要复制该元素的范围内的所有命名空间。

如果您更改,则会看到不同的结果:

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

为:

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

不确定这对你的真实问题有多好。