2017-08-25 44 views
1

我有一大组我们最近浏览过的XSL,并实现了一个具有公共位的共享XSL模板。我们在所有主要的XSL中都包含了一个xsl:include来引入这些内容。在开始修改共享XSL之前,我们没有任何问题。如何在转换中打破已包含XSL的存在数据库上的缓存

有关信息,整个系统基于Web,通过XSL FO和RenderX调用查询来动态格式化数据库中的文档。

主要变换是:

let $fo := util:expand(transform:transform($articles, doc("/db/Customer/data/edit/xsl/Custbatch.xsl"), $parameters)) 

这XSL(Custbatch.xsl)有:

<xsl:include href="Custshared.v1.xsl"/> 

如果我们进行编辑,以 “Custshared.v1.xsl” 没有反映在结果是因为显然“Custshared.v1.xsl”正被缓存和使用。我们知道这一点,因为您可以看到名称现在包含“v1”。如果我们进行更改并将所有参考文献从v1更改为v2,它都可以工作。但是这看起来有点荒谬,因为这意味着我们必须更改包含这个XSL的18个XSL,或者像重新启动数据库那样做一些愚蠢的事情。

所以,我在安装程序或controller.xql(它在所有不匹配的路径上具有以下内容)中丢失了什么,以使事情不会缓存。我认为这都是内部的,所以这个设置可能没有关系。有配置中有其他设置吗?

<dispatch xmlns="http://exist.sourceforge.net/NS/exist"> 
    <cache-control cache="no"/> 
</dispatch> 

在这里阅读文档:http://exist-db.org/exist/apps/doc/xsl-transform.xml,它指出:

“样式表将使用标准Java API(javax.xml.transform中)编译成一个模板,该模板之间的所有共享函数的实例,并且只会在自上次调用后进行修改时重新加载。“

但是,如果我更改了包含的XSL,它并未被使用。

更新#1

我还跟尽可能创造返回包含在XSL的查询,然后我用:

<xsl:include href="http://localhost/get-include-xsl.xq"/> 

这不工作的格式不破,但更改底层XSL会得到相同的结果。所以即使是Xquery结果也被缓存了。

更新#2

是的,通过一些简单的测试都证明。 如果我对根模板进行了任何更改(如添加无意义的空间)并运行,它确实包含了在include中所做的更改。如果我只有更改包含的XSL,则不会发生更改。

因此缺乏其他任何东西,我们总是可以编写一个Xquery,在对包含模板进行更改后,基本上可以触及所有主模板。似乎是错误的解决方法。

更新#3

所以目前我们所使用的解决办法是,我们在XSL未使用的“变量”(版本),当我们更新共享模板,我们执行该查询基本上更新该变量的值。至少它只有一个XQuery,也许我们应该附加到触发器。

+0

您正在使用什么版本的存在,但分贝的?缓存XSLT的机制最近已更改。 – adamretter

+0

我相信2.2, #eXist建立信息 project.version = 2.2 project.built = 20141120124006 scm.branch =主 scm.revision = 5c5aadc –

+0

我不觉得这种行为特别令人惊讶:这是很常见的包含XSLT处理以在第一个引用上编译样式表的Web服务,然后在重新使用相同源URI的情况下重用编译后的样式表。无论有什么方法清除这个缓存,或者完全禁止缓存,我都不知道。 –

回答

1

有一个在$exist-db-root$/conf.xml的XSL转换,你可以关闭缓存的设置:<transformer class="net.sf.saxon.TransformerFactoryImpl" caching="no">(默认为“是”)

相关问题