XSLT1 spec, xsl:import
section对于以下内容不是很明确/直接:
output
标记,会使用什么?xmlns:xsl
)或其他全局(例如exclude-result-prefixes
),那么全局将使用什么?我有一个带有所有属性和全局标签的“集线器XSLT”......但是现在我正在导入一些也是独立XSLT的XSLT,所以也许将来我会注意到惊喜......为了避免意外,这个问题
总结问题:
如果“hub XSLT”拥有全部XSLT,那么所有XSLT都可以“没有gobal标签”吗?如果存在冲突,优先规则是什么?
答案 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]他应用于导入的样式表中的元素的
version
,extension-element-prefixes
,exclude-result-prefixes
和xpath-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