XSL:关于常规样式表属性的导入约定



XSLT1规范,xsl:import部分对以下内容不是很清楚/直接:

  • 如果两者都有output标签,将使用什么?
  • 如果两者都具有命名空间属性 ( xmlns:xsl ( 或其他全局属性 (例如 exclude-result-prefixes(,全球将使用什么?
  • 。等。。。

我有一个包含所有属性和全局标记的"中心 XSLT"......但是现在我正在导入一些也是独立 XSLT 的 XSLT,所以也许将来我会注意到惊喜......为了避免意外,这个问题。

总结问题:

如果"中心 XSLT"拥有所有 XSLT,是否可以"清空 gobal 标记"? 如果存在冲突,优先规则是什么?

您是在问仅在导入模块中拥有所有声明是否足够,但同时您又说所有模块也是"独立的"XSLT 样式表?对我来说毫无意义。显然,如果导入的模块没有声明,它将不再是完整的样式表,并且在缺少命名空间声明的情况下,它将不再是格式正确的XML。格式错误的 XML 样式表将完全无用。


通常,导入的声明

(物理驻留在导入的样式表模块中的声明(的优先级较低。但需要一些资格。

xsl:output/@method

xsl:output声明中,如果样式表之间存在冲突,则导入模块优先于导入模块。因此,将使用导入样式表中声明的输出方法。但这里有一个警告:并非所有xsl:output属性都以相同的方式处理。

命名空间

导入样式表中

定义的命名空间(以及前缀(在导入的样式表中不可用。这意味着,如果您定义

xmlns:ns="www.namespace.com"

在导入样式表中,前缀ns将不会连接到导入模块中的命名空间 URI "www.namespace.com"。在这种情况下,您需要重新声明命名空间。

如果你思考一下这个事实,就会明白为什么会这样:样式表(模块(不需要导入。应该始终可以单独使用它或导入它。确保样式表保持其独立性的唯一方法是声明其中的所有命名空间。

exclude-result-prefixes

对于像exclude-result-prefixes这样的属性,我引用迈克尔·凯1 的话,说

应用于导入样式表中元素的versionextension-element-prefixesexclude-result-prefixesxpath-default-namespace属性以及xml:langxml:space的值是在它们自己的模块的<xsl:stylesheet>元素中定义的,而不是在导入模块的<xsl:stylesheet>元素中定义的。

找到规则的最简单方法当然是简单地测试。在大多数情况下,测试将是一个非常微不足道的测试。例如,在样式表模块中定义两个输出方法:

<xsl:output method="text"/>      <xsl:output method="xml"/>

并查看输出是文本还是 XML。

这正是您应该如何找到"...等等......"从你的问题。


1 Michael Kay,XSLT 2.0 和 XPath 2.0 Programmer's Reference,第 358 页

最新更新