我处理这个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>
元素,然后处理它们。
答案 0 :(得分:1)
好吧,您的$x
变量包含xmlns:data="http://portonvictor.org/ns/misc"
命名空间中的元素 - 您复制的元素是该元素的后代。
复制元素时,还要复制该元素的范围内的所有命名空间。
如果您更改,则会看到不同的结果:
<xsl:copy-of select="$x/*/*"/>
为:
<xsl:copy-of select="$x/*/*" copy-namespaces="no"/>
不确定这对你的真实问题有多好。