每当在 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
util.xsl
Contains functions/variables used by FILE_A, FILE_B, FILE_C
这些消息是由最近发布的 Saxon 生成的。多次导入同一个文件并不是错误,但在某些处理器(包括早期版本的 Saxon)中,效率非常低;这也是不必要的,并且会使代码非常难以调试。基本上,这意味着您存在具有不同优先级的相同模板规则的多个实例。
在 XSLT 中,与其他语言不同,模块不需要为其所依赖的所有内容进行导入。您只需要在样式表中的任何位置进行一次导入。确实,如果 A.xsl 使用 util.xsl 并且您想在很多地方重用 A.xsl,那么如果 A.xsl 使用导入或包含声明声明其依赖项会很方便,这意味着如果 B.xsl 也使用 util.xsl,您最终会遇到多次导入的情况。
我添加消息是因为两个事件:一个用户从 xsl:next-match 获得了完全奇怪的效果,另一个用户获得了病态的糟糕编译时性能,因为一个模块通过大约 100,000 个不同的路由组合导入,因此大约 100,000 个不同的导入优先级。当出现这样的问题时,总是倾向于试图确保它永远不会再次发生,警告是对此的回应,但就像健康和安全警告一样,很难知道何时平衡是正确的。如果一切正常,您可以随时忽略警告,如果您确实需要,您可以随时通过在 ErrorListener 中过滤消息来抑制它。
如果您只使用该集合中的样式表,即永远不要使用 FILE_C.xsl 作为独立的顶级样式表,您可以简单地取出 utils.xsl 的导入,导入具有全局范围,因此 FILE_C.xsl 中的模板将"看到"来自 utils.xsl 的模板,即使它是在导入树的更高位置导入的。 utils.xsl 只会导入一次,警告就会消失。
或者,您可以保持原样,这不是错误,系统不应该真正用非错误来打扰您。那是哪个 XSLT 系统?也许它可以选择在警告中不那么激进?