从eXist / xslt访问“filesystem” - find ../html/*_myId.html(with collection()?)

时间:2014-10-09 10:59:14

标签: xslt saxon exist-db

在将我的大型xml文件转换为一系列分页的html片段之后,为了进行交叉引用,我现在正在开发一个xsl函数,它需要知道某个节点(或者它已被转换为的元素)的哪个文件已经结束在。。

文件的名称如下:001_div1.html002_div2.html等。假设我知道我想要_div25.html,但我不知道数字前缀。据我了解,xpath的collection()函数可以帮助我,但它没有。

我认为这是由于eXist启动的saxon没有意识到我们正在处理xml数据库中的节点,而不是文件系统中的文件。但是再一次,使用doc('../../html/003_div3.html')它可以像document-available('../../html/003_div3.html')一样工作,所以这些函数以某种方式来自db ...

我想做的是:

<xsl:for-each select="collection('../../html/*_div25.html')">
    <xsl:value-of select="tokenize(replace(document-uri(.), '.html$', ''),'/')[last()]"/>
</xsl:for-each>

但是这给了我:

Exception while transforming node: Exception thrown by URIResolver

以下是我目前使用的黑客攻击:

<xsl:for-each select="1 to $maxNumberOfHtmlFragments">    <!-- For all those numbers, check if there is a filename 
                                                               starting with the number, followed by the known NodeId,
                                                               and ending with .html. -->
    <xsl:variable name="filename" select="concat('../../html/', xs:string(format-number(position(), '000')), '_div25.html')"/>
    <xsl:if test="doc-available($filename)">
        <xsl:value-of select="tokenize(replace($filename, '.html$', ''),'/')[last()]"/>
    </xsl:if>
</xsl:for-each>

但是这会对性能产生很大的影响!请注意,在document()doc-available()中使用相同的路径(当然没有通配符)可以正常工作。

关于collection()函数缺少eXist-saxon连接吗?

有没有更好的方法来实现我想要的东西?

1 个答案:

答案 0 :(得分:0)

您无法使用Collection访问特定文档。

在您的示例中,您有:

collection('../../html/*_div25.html')
eXist集合中的

与文件系统中的文件夹类似,因此您可以访问0..N文档。您可以使用以下内容从数据库访问集合:

collection('../../html')

然后,您可以在谓词中使用document-uri()来过滤文档。例如

collection('../../html')[fn:ends-with(fn:document-uri(.), "_div24.html")]