我有一个集合/db/apps/myfoo/data
(在eXist-db 4.7中),其中/data
包含几百个集合,如下所示:
/db/apps/myfoo/data/TC0001
/db/apps/myfoo/data/TC0002
/db/apps/myfoo/data/TC0003
/db/apps/myfoo/data/TC0004
/db/apps/myfoo/data/TC0005
etc.
每个集合都包含大量XML文档,每个XML文档的属性都@corresp
类似@corresp="TC0001"
。
在我的Xquery模块中,我将数据收集加载到一个变量中
let $mydata := collection("/db/apps/myfoo/data")
因为该data
函数将以许多不同的方式访问整个集合。
某一时刻,我需要计算每个集合中的文档,因此我将添加一个谓词,例如:
let $ct := count($mydata//tei:TEI[@corresp eq "TC0001"])
但是,我想通过将集合作为谓词添加而不是强制在数千个不相关的文档中进行搜索来加快计数速度(如果可能)。据我了解,集合不是node
。那有可能吗?
这是伪代码的示例,其中TC0001
是集合:
let $ct := count($mydata/TC0001/tei:TEI)
非常感谢。
您可以从节点使用获取文档的URI fn:document-uri(fn:root($node))
。
由此,您可以使用一些正则表达式来获取Collection URI,例如 fn:replace($doc-uri, "(.*)/.*", "$1")
然后,您可以在谓词比较中使用它。
例如:
let $mydata := collection("/db/apps/myfoo/data")
let $ct := count($mydata//tei:TEI[fn:replace(fn:document-uri(fn:root(.)), "(.*)/.*", "$1") eq "my-sub-collection-name"])
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句