XSL:避免将命名空间定义导出到生成的 XML 文档

Posted

技术标签:

【中文标题】XSL:避免将命名空间定义导出到生成的 XML 文档【英文标题】:XSL: Avoid exporting namespace definitions to resulting XML documents 【发布时间】:2010-10-25 19:32:39 【问题描述】:

我想从一些 XML 文件中获取数据并将它们转换成一个新的 XML 文档。但是,我不希望 XSLT 中命名空间的定义出现在结果文档中。

换句话说:

来源:

<Namespace:Root xmlns:Namespace="http://www.something.com">

样式表:

<?xml version="1.0" encoding="ISO-8859-1"?>
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:Namespace="http://www.something.com">

结果:

<resultRoot xmlns:Namespace="http://www.something.com">
<!--I don't want the Namespace definition above-->

我正在使用 msxsl 进行转换。

【问题讨论】:

【参考方案1】:

使用 extension-element-prefixes="Namespace"

喜欢:

<xsl:stylesheet
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:datetime="http://exslt.org/dates-and-times"
xmlns:str="http://exslt.org/strings"
xmlns:exsl="http://exslt.org/common"
xmlns:uw="xalan://ru.sbtc.util.XSLUtil"
extension-element-prefixes="exsl str datetime uw"
version="1.0">

【讨论】:

我假设您的意思是排除结果前缀? 我们正在使用扩展元素前缀,它工作得很好。 extension-element-prefixes 确实有同样的效果,但它有一个额外的效果。您放入其中一个命名空间的任何元素都将被解释为扩展元素(而不是文字结果元素)。这可能很适合您在答案中的示例。但是,如果您不想要那种额外的行为,那么只需使用 exclude-result-prefixes【参考方案2】:

您可以使用xsl:stylesheet 元素的exclude-result-prefixes 属性来避免将命名空间前缀发送到输出文档中:

<?xml version="1.0" encoding="ISO-8859-1"?>
<xsl:stylesheet version="1.0"
         xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
         xmlns:prefix1="http://www.something.com"
         exclude-result-prefixes="prefix1">

</xsl:stylesheet>

要抑制输出文档中的多个命名空间,请指定它们以空格分隔:

exclude-result-prefixes="prefix1 prefix2 prefix3"

来自XSLT specification:

当样式表仅出于寻址源树的目的使用命名空间声明时,在 exclude-result-prefixes 属性中指定前缀将避免结果树中多余的命名空间声明。

【讨论】:

【参考方案3】:

divo 的答案已经被选中,而且是恰当的。

但是,如果您有兴趣深入挖掘,请查看我的巨著中关于“XSLT 中的命名空间”这一广受欢迎的主题的 "Too many namespaces" 部分。 (是的,这是在开玩笑。:-))

【讨论】:

嗨@埃文!一个非常有用的链接,确实!在使用副本时没有不需要的命名空间的技巧正是我想要的。不过,令我惊讶的是,这个技巧确实不适用于 XSLT 2.0(例如使用 XALAN),但您必须遵循您为 2.0 绘制的路径。在 XSLT 1.0 中(例如使用 xsltproc)它运行良好。因此,从 XSLT 1.0 切换到 XSLT 2.0 处理器实际上可以显着改变输出,尽管在语义上额外的命名空间不应该成为下游问题,除非可能是体积方面。 这是实际问题的真正答案!为我提供 XSLT 1.0 解决方案的坦克!

以上是关于XSL:避免将命名空间定义导出到生成的 XML 文档的主要内容,如果未能解决你的问题,请参考以下文章

使用 XSL 根据 XML 的条件添加命名空间

在 XSL 翻译中更改 XML 文件的命名空间

XML - 试图掌握命名空间 URI 的概念

XML的命名空间

如何从输出 xml 中删除命名空间?

XSL:删除命名空间前缀