来自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中的集合进行密集搜索的解决方案。
如果有的话,我希望这篇文章能帮助以后的搜索者遇到相同的问题。
答案 0 :(得分:4)
一般的架构原则是:尝试使搜索更接近数据。在这种情况下,这意味着:使用eXist查找感兴趣的文档,不要从eXist中提取所有可能的候选文档,然后要求Saxon进行搜索。在eXist XQuery中选择实际感兴趣的文档,然后通过样式表参数将这些文档的列表传递给Saxon。