xsl:关于一般样式表属性的导入约定

时间:2014-09-24 18:18:27

标签: xslt import xslt-1.0 global

XSLT1 spec, xsl:import section对于以下内容不是很明确/直接:

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

我有一个带有所有属性和全局标签的“集线器XSLT”......但是现在我正在导入一些也是独立XSLT的XSLT,所以也许将来我会注意到惊喜......为了避免意外,这个问题

总结问题:

如果“hub XSLT”拥有全部XSLT,那么所有XSLT都可以“没有gobal标签”吗?如果存在冲突,优先规则是什么?

1 个答案:

答案 0 :(得分:2)

您在询问是否仅在导入模块中拥有所有声明是足够的,但与此同时您说所有模块也是"独立的" 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这样的属性我引用Michael Kay 1 ,说

  

[t]他应用于导入的样式表中的元素的versionextension-element-prefixesexclude-result-prefixesxpath-default-namespace属性的值,以及{{1 }和xml:lang,是那些在他们自己的模块的xml:space元素中定义的,而不是在导入模块的<xsl:stylesheet>元素上定义的那些。

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

<xsl:stylesheet>

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

这就是你应该如何找到&#34; ......等等的规则......&#34;从你的问题。


1 Michael Kay,XSLT 2.0和XPath 2.0程序员参考,p。 358