Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/xslt/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在XSLT中处理重复导入?_Xslt_Xslt 1.0_Xslt 2.0 - Fatal编程技术网

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

如何在XSLT中处理重复导入?,xslt,xslt-1.0,xslt-2.0,Xslt,Xslt 1.0,Xslt 2.0,只要在XSL转换中多次导入同一文件,就会引发警告。通常会多次包含或导入与样式表模块文件:/Users/blake/Documents/workspace/course connect parent/course connect publisher/src/main/xsl/config.xsl类似的内容。这是允许的,但可能会导致错误或意外行为 但是,如果需要通过多个“子”xsl调用(例如,包含重要函数的util.xsl)导入相同的xsl,则这种情况是不可避免的 有没有办法避免这些警告,或者有更好

只要在XSL转换中多次导入同一文件,就会引发警告。通常会多次包含或导入与
样式表模块文件:/Users/blake/Documents/workspace/course connect parent/course connect publisher/src/main/xsl/config.xsl类似的内容。这是允许的,但可能会导致错误或意外行为

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

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

以下是问题设置:

文件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
imports util.xsl
contains templates used by FILE_A.xsl
uses functions/parameters from util.xsl
imports util.xsl
contains templates used by FILE_A.xsl
uses functions/parameters from util.xsl
Contains functions/variables used by FILE_A, FILE_B, FILE_C
文件_B.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
imports util.xsl
contains templates used by FILE_A.xsl
uses functions/parameters from util.xsl
imports util.xsl
contains templates used by FILE_A.xsl
uses functions/parameters from util.xsl
Contains functions/variables used by FILE_A, FILE_B, FILE_C
文件_C.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
imports util.xsl
contains templates used by FILE_A.xsl
uses functions/parameters from util.xsl
imports util.xsl
contains templates used by FILE_A.xsl
uses functions/parameters from util.xsl
Contains functions/variables used by FILE_A, FILE_B, FILE_C
util.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
imports util.xsl
contains templates used by FILE_A.xsl
uses functions/parameters from util.xsl
imports util.xsl
contains templates used by FILE_A.xsl
uses functions/parameters from util.xsl
Contains functions/variables used by FILE_A, FILE_B, FILE_C

如果您只使用该集合中的样式表,即从不使用FILE_C.xsl作为自立的顶级样式表,则只需将utils.xsl的导入取出,导入具有全局作用域,因此文件_C.xsl中的模板将“看到”utils.xsl中的模板,即使该模板是在导入树的更高位置导入的。utils.xsl将只导入一次,警告将消失


或者你可以让事情保持原样,这不是一个错误,系统不应该因为没有错误而真正困扰你。这是哪个XSLT系统?也许它可以选择在警告中不那么咄咄逼人?

这些消息是由Saxon的最新版本生成的。多次导入同一文件不是错误,但在某些处理器(包括早期版本的Saxon)中效率非常低;这也是不必要的,而且会使代码很难调试。基本上,这意味着同一模板规则的多个实例具有不同的先例

在XSLT中,与其他语言不同,模块不需要对其依赖的所有内容都进行导入。您只需要在样式表中的任何位置导入一次。诚然,如果A.xsl使用util.xsl,并且您希望在许多地方重用A.xsl,那么如果A.xsl使用导入或包含声明声明其依赖关系,则会很方便,这意味着如果B.xsl也使用util.xsl,那么最终将出现这种多个导入的情况


我之所以添加这些消息是因为发生了两件事:一个用户从xsl:next match中获得了完全奇怪的效果,另一个用户的编译时性能非常差,因为一个模块是由大约100000个不同的路径组合导入的,因此导入先例大约100000个。当这样的问题出现时,总有一种倾向,即试图确保它不再发生,警告是对这种情况的回应,但就像健康和安全警告一样,很难知道平衡何时正确。如果一切正常,您总是可以忽略警告;如果确实需要,您可以通过过滤ErrorListener中的消息来抑制警告。

您使用的是“奇怪”的XSLT处理器。我使用XSLT已经12年多了,虽然我大量使用
,但从未看到过这样的警告。多次导入同一样式表模块并不是一个错误。只需忽略这些警告(或者如果它们让您烦恼,请更改您的XSLT处理器)。正如其中一个答案所指出的,这似乎是撒克逊人的一个“特征”。啊,我明白了。我认为它的工作更像C++。现在这就更有意义了。谢谢。事实上,看起来我还是有些误解。听起来像是说如果A.xsl导入util.xsl、B.xsl和C.xsl,那么B.xsl和C.xsl应该有util.xsl可用。但在《氧气与日食》中,它报告了这种情况下的一个错误。导入似乎向上传播(例如从B.xsl传播到A.xsl),但不会向下传播。因此,如果我将导入放在A.xsl中,我会在B和C中得到错误,但是如果我将导入放在B和C中,我不会得到错误,但是我会得到警告(我得到警告,我可以忽略,但它们仍然会困扰我)。oXygen(我不知道Eclipse)允许您声明样式表模块是一组相关模块的一部分,在这种情况下,它不再要求模块作为独立样式表有效。也许我的编辑器工作不正常,但它看起来不像导入向下传播,而是向上传播。如果我在A中导入,B和C都不知道。如果我在C和B中导入,A就知道了。现在应该这样做吗?顺便说一句,我在Oxygen和IntelliJ中编辑。编辑器并不总是知道(虽然我似乎记得你可以告诉Oxygen),但这是规则,编辑器可能认为你有未定义的变量,但这是错误的,不管怎样,忽略它并在xslt中运行它:-)