2014-10-09 22 views
0

在将我的大型xml文件转换为一系列分页的html片段后,在xsl函数上工作,需要知道哪个文件某个节点(或其已转换为的元素)已结束。从eXist/xslt - find ../html/*_myId.html(with collection()?)访问“filesystem”

这些文件被命名为:001_div1.html,002_div2.html等。假设我知道我想要_div25.html,但我不知道数字前缀。据我了解,xpath的collection()函数可以帮助我,但它不会。

我认为这是由于eXist发布的saxon没有意识到我们正在处理xml数据库中的节点而不是文件系统中的文件。但话又说回来,随着doc('../../html/003_div3.html')它的工作,因为它与document-available('../../html/003_div3.html')做,所以这些功能在某种程度上从数据库节点喂......

我想这样做是这样的:

<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

的'collection'会给你的文档节点的序列和你'replace'呼叫然后将上,而你的第二个样本做了非常不同的每个节点的字符串值操作,构建一个URI作为字符串'$ filename',检查'doc-available($ filename)',然后在该字符串上使用'replace'。所以我想第一个示例希望尝试像''。 – 2014-10-09 11:22:09

+0

再一次,还有'URIResolver抛出的异常'还有'document-uri(。)'错误,你建议我使用它。 我的印象是,在我做的所有(混乱)测试过程中,我有_never_没有触发这个错误的'collection()'调用。鉴于'collection()'似乎是一个“非标准化的标准函数”,您是否可以确认它应该在由xquery transform:transform应用的XSLT文件中工作? – awagner 2014-10-09 13:41:48

+0

不,对不起,我甚至不是一个存在数据库用户,我只是试图指出两个代码示例之间的不一致性。我相信别人可以告诉你更多关于存在数据库的具体问题。 – 2014-10-09 14:26:04

回答

0

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

在你的榜样,你有:

collection('../../html/*_div25.html') 

中不存在收藏就像文件系统中的文件夹,因此您可以访问0..N文件。你也许可以从使用类似访问数据库中的一个集合:

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

然后你可以使用document-uri()在谓词来过滤文件。例如

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

这给出URIResolver抛出的异常...... – awagner 2014-10-09 13:33:03

+0

因此,“可能”,我想你正在被这个咬伤 - https://github.com/eXist-db/exist/issues/351 – adamretter 2014-10-09 14:51:49

+0

是的,可能。所以我现在会继续我的黑客解决方法。只有我怀疑'doc(...)','doc-available(...)'等才能正常工作(即他们从eXist的“../../html”集合中访问“文件”)。那不就是说eXist已经有了解析器吗? – awagner 2014-10-09 21:39:37

相关问题