在将我的大型xml文件转换为一系列分页的html片段之后,为了进行交叉引用,我现在正在开发一个xsl函数,它需要知道某个节点(或者它已被转换为的元素)的哪个文件已经结束在。。
文件的名称如下:001_div1.html
,002_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连接吗?
有没有更好的方法来实现我想要的东西?
答案 0 :(得分:0)
您无法使用Collection访问特定文档。
在您的示例中,您有:
collection('../../html/*_div25.html')
eXist集合中的与文件系统中的文件夹类似,因此您可以访问0..N文档。您可以使用以下内容从数据库访问集合:
collection('../../html')
然后,您可以在谓词中使用document-uri()
来过滤文档。例如
collection('../../html')[fn:ends-with(fn:document-uri(.), "_div24.html")]