如何在XSLT中处理重复导入?

时间:2012-04-10 20:37:03

标签: xslt xslt-1.0 xslt-2.0

只要在XSL转换中多次导入同一文件,就会抛出警告。通常是Stylesheet module file:/Users/blake/Documents/workspace/course-connect-parent/course-connect-publisher/src/main/xsl/config.xsl is included or imported more than once. This is permitted, but may lead to errors or unexpected behavior

的内容

但是,似乎如果需要通过多个'children'xsl调用导入相同的xsl(例如,包含重要函数的util.xsl),这种情况是不可避免的。

有没有办法避免这些警告,或者更好的办法?

以下是问题设置:

FILE_A.xsl

imports FILE_B.xsl and FILE_C.xsl
uses functions/parameters from util.xsl, which it gets from FILE_B.xsl & FILEC.xsl
calls templates in FILE_B.xsl
calls templates in FILE_C.xsl

FILE_B.xsl

imports util.xsl
contains templates used by FILE_A.xsl
uses functions/parameters from util.xsl

FILE_C.xsl

imports util.xsl
contains templates used by FILE_A.xsl
uses functions/parameters from util.xsl

util.xsl

Contains functions/variables used by FILE_A, FILE_B, FILE_C

2 个答案:

答案 0 :(得分:9)

这些消息是由最近发布的Saxon产生的。不止一次导入同一个文件并不是一个错误,但在某些处理器(包括早期版本的Saxon)中效率非常低;它也是不必要的,它可以使代码很难调试。基本上,这意味着您有多个具有不同优先级的相同模板规则的实例。

在XSLT中,与其他语言不同,模块不需要对其依赖的所有内容进行导入。您只需要在样式表中的任何位置导入一个。这是真的,如果A.xsl使用util.xsl并且你想在很多地方重用A.xsl,那么如果A.xsl使用import或include声明声明它的依赖关系会很方便,这意味着如果B. xsl也使用util.xsl,你最终会遇到多次导入的情况。

由于两个事件,我添加了消息:一个用户从xsl获得完全奇怪的效果:next-match,另一个用户在编译时遇到病态性能不佳,因为一个模块组合导入了大约100,000个不同的路线,因此约有100,000个不同的进口优先权。当这样的问题出现时,总会有一种趋势,即试图确保它再也不会发生,并且警告是对此的反应,但是就像健康和安全警告一样,很难知道何时平衡是正确的。如果一切正常,您可以随时忽略警告,如果您真的想要,可以通过过滤ErrorListener中的消息来抑制它。

答案 1 :(得分:2)

如果你只使用该集合中的样式表,即永远不使用FILE_C.xsl作为一个独立的顶级样式表,你可以简单地导入utils.xsl,导入具有全局作用域,因此FILE_C中的模板.xsl将“看到”utils.xsl中的模板,即使它是在导入树中向上导入的。 utils.xsl只会被导入一次,警告就会消失。

或者你可以保留原样,这不是一个错误,系统不应该真正困扰你没有错误。那是哪个XSLT系统?也许它可以选择在警告中不那么激进?