2014-10-09 51 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

相關問題