eXist-db / XSLT / Saxon collection()像糖蜜一样缓慢(或出现内存限制错误)

时间:2018-10-23 09:07:08

标签: xslt xquery saxon exist-db

来自this question,我管理了一种从从eXist-db / Xquery转换函数中加载的XSLT 2.0文档访问eXist-DB collection()的完全不令人满意的解决方案:

XSLT文件声明了一个变量:

 <xsl:variable name="coll" select="collection('xmldb:exist:///db/apps/deheresi/data/collection_ms609.xml')"/>

这指向我创建的目录xml文件(按Saxon documentation),该文件看起来像这样,以便加载 actual 集合:

<collection stable="true">
  <doc href="xmldb:exist:///db/apps/deheresi/data/ms609_0001.xml"/>
  <doc href="xmldb:exist:///db/apps/deheresi/data/ms609_0002.xml"/>
  ...
  ...
  <doc href="xmldb:exist:///db/apps/deheresi/data/ms609_0709.xml"/>
  <doc href="xmldb:exist:///db/apps/deheresi/data/ms609_0710.xml"/>
</collection>

这允许XSLT文件使用需要在所有这些文件中进行搜索的键:

<xsl:key name="correspkey" match="tei:seg[@type='dep_event' and @corresp]" use="@corresp"/>

<xsl:variable name="correspvar" select="self::seg[@type='dep_event' and @corresp]/@corresp"/>

<xsl:value-of select="$coll/(key('correspid',$correspvar) except $correspvar)/@id" separator=", "/>

就目前而言,如果我的目录中有50个文档,那么我会在2分钟内得到结果;所有710都在4分钟后出现Java GC错误。

我在eXist-DB中的相关节点上设置了索引,但这对性能没有任何作用。在我看来,Saxon在eXist-DB的优化之外进行工作,将eXist-DB视为一个简单的文件系统。

(为此,设置href="/db/apps/deheresi/data/ms609_0001.xml"不会让Saxon看到文档。)

我怀疑所有这就是为什么eXist-DB documentation不存在的原因。

目前,我正在寻找针对Xquery transform()在eXist-DB中加载的XSLT 2.0中的集合进行密集搜索的解决方案。

如果有的话,我希望这篇文章能帮助以后的搜索者遇到相同的问题。

1 个答案:

答案 0 :(得分:4)

一般的架构原则是:尝试使搜索更接近数据。在这种情况下,这意味着:使用eXist查找感兴趣的文档,不要从eXist中提取所有可能的候选文档,然后要求Saxon进行搜索。在eXist XQuery中选择实际感兴趣的文档,然后通过样式表参数将这些文档的列表传递给Saxon。