在將我的大型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