2012-09-10 28 views
0

我明白如下使用document()。另一臺計算機/服務器上的文件的文檔()函數

<xsl:value-of select="document('path\to\docuemnt.xml')/RootElement/Element"/> 

而這必須是父XSL文件的相對路徑。但是如果我需要引用本地網絡中另一臺服務器上託管的文件呢?我嘗試過這樣的事情。

<xsl:value-of select="document('\\servername\path\to\document.xml')/RootElement/Element"/> 

但是,這將引發一個錯誤,因爲它看起來在

C:\path\to\xsl\\servername\path\to\document.xml 

這當然不存在。

+2

答案將取決於您的XSLT處理器,操作系統和文件系統。作爲一個經驗法則,你可以安全地使用file :: protocol。無論您的XSLT處理器是否支持目錄,也可能會影響結果。請告訴我們您的上下文(XSLT處理器等) –

+1

例如,在Saxon處理器上,您可以使用標準file :: protocol引用任何文件,但只能使用短文件名形式。如果您使用長文件名,Saxon將無法找到該文件。 –

+2

作爲文件協議的替代方法,如果文件通過http可用,則可以指定它的http協議格式URI。 –

回答

3

此解決方案僅涉及撒克遜-HE 9.4.0.3N XSLT處理器,在控制檯應用程序的形式,在Windows 7

以我的實驗中,我發現,該文件()函數將接受的文件名或URI。不過,我會避免文件名,因爲它們需要是短格式的。如果使用長格式,文件名將被拒絕。

假設你的文檔是...

c:\path\to\document.xml 

在其上映射到驅動器 'J' 服務器ServerName。

要從此用作文件()的參數值形成URI ...

file:///j:/path/to/document.xml 

在相對於URI,我弄錯約撒克遜不接受長格式。這僅適用於文件名。但是,有一些陷阱...

  1. 請注意正斜槓。反斜槓不起作用。
  2. 我還沒有找到一種方法來構建一個可操作的文件:只有UNC名稱的URI。您需要將驅動器映射到一個字母。
  3. 因任何原因未能打開文檔將被報告爲相同的錯誤。對於文件系統,有太多可能出錯的事情,如果你無法打開文件,那麼假定URI是錯誤的是不安全的。可能有許多世俗的原因,爲什麼文件無法在特定時間打開。
  4. 小心防火牆問題。這些發揮了作用。
  5. 許多文本編輯器(如NotePad ++)在缺少BOM並且未使用兩種UTF-16編碼之一進行編碼時假定文本文件在系統代碼頁中進行了編碼。 Saxon會默認假設文件是​​以UTF-8編碼的,所以如果您在NotePad ++(ä)中使用我的代碼頁時有這樣的字符,Saxon會吐出虛擬文件,並報告它無法打開文件。 (另外:我不確定我的代碼頁是什麼,我的o/s是Win7,當前系統區域設置是英語(澳大利亞),它是確定系統代碼頁的本地系統)。 Saxon不打開文檔的原因是某些代碼頁中的(ä)編碼產生的字節序列不是有效的UTF-8序列。
  6. 底層操作系統不支持不是URL路徑的URI路徑。撒克遜可能會如實地說它支持與文檔()函數相關的URI,但這並不會煮沸任何捲心菜,因爲在實踐中,您不能使用它們。 - 至少不是在Windows系列的o/s上。
  7. 請忽略文件協議上的MSDN page。撒克遜文檔()函數不接受該頁面上建議的URL形式(包括|字符等)。使用我上面建議的形式。我已經測試過它,它工作。
+0

這也適用於我。謝謝! – Horba

+0

煮白菜?這是澳大利亞人嗎? :-) – LarsH

+1

這裏給出了一個關於Windows文件名映射到URI的好文章:http://blogs.msdn.com/b/ie/archive/2006/12/06/file-uris-in-windows。 ASPX。但是,映射不是標準化的,你不能假定Java會像.NET那樣執行。 –

3

您對document()的理解不正確。它期望一個URI,而不是文件名。

+0

謝謝, Works。假設我必須安排文件在http://可訪問的位置可用。 – Horba

+2

它不一定是一個HTTP URI,一個文件:URI對於我所知道的所有處理器都可以正常工作。 (接受的實際協議集是實現定義的,例如一些處理器可能接受ftp,其他處理器則不接受) –

相關問題