6

只要在 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

但是,如果同一个 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

实用程序.xsl

Contains functions/variables used by FILE_A, FILE_B, FILE_C
4

2 回答 2

10

这些消息是由最近发布的 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 中过滤消息来抑制它。

于 2012-04-11T08:19:22.137 回答
2

如果您只使用该集合中的样式表,即从不使用 FILE_C.xsl 作为自立的顶级样式表,您可以简单地将 utils.xsl 导入导出,导入具有全局范围,因此 FILE_C.xsl 中的模板将“查看”来自 utils.xsl 的模板,即使它是在导入树的较高位置导入的。utils.xsl 只会被导入一次,警告就会消失。

或者,您可以保持原样,这不是错误,系统不应该真的因为非错误而打扰您。那是哪个 XSLT 系统?也许它可以选择在警告中不那么激进?

于 2012-04-11T00:07:19.243 回答