在将我的大型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连接是否缺乏?
是否有更好的方法实现我想要的呢?
的'collection'会给你的文档节点的序列和你'replace'呼叫然后将上,而你的第二个样本做了非常不同的每个节点的字符串值操作,构建一个URI作为字符串'$ filename',检查'doc-available($ filename)',然后在该字符串上使用'replace'。所以我想第一个示例希望尝试像' '。 –
2014-10-09 11:22:09
再一次,还有'URIResolver抛出的异常'还有'document-uri(。)'错误,你建议我使用它。 我的印象是,在我做的所有(混乱)测试过程中,我有_never_没有触发这个错误的'collection()'调用。鉴于'collection()'似乎是一个“非标准化的标准函数”,您是否可以确认它应该在由xquery transform:transform应用的XSLT文件中工作? – awagner 2014-10-09 13:41:48
不,对不起,我甚至不是一个存在数据库用户,我只是试图指出两个代码示例之间的不一致性。我相信别人可以告诉你更多关于存在数据库的具体问题。 – 2014-10-09 14:26:04