2011-09-28 35 views
1

我現在有一個文件的完整路徑像一個字符串:XQuery的子問題

"/db/Liebherr/Content_Repository/Techpubs/Topics/HyraulicPowerDistribution/Released/TRN_282C_HYD_MOD_1_Drive_Shaft_Rev000.xml" 

不過,現在我需要拿出唯一的文件夾路徑,所以這將是上面的字符串沒有最後回斜線狀內容:

"/db/Liebherr/Content_Repository/Techpubs/Topics/HyraulicPowerDistribution/Released/" 

但似乎XQuery中的子串()函數只有子(字符串,開始,LEN)或子(字符串,開始),我試圖找出辦法指定最後一次反斜槓的發生,但沒有運氣。

專家能幫忙嗎?謝謝!

回答

1

這甚至可以與單個的XPath 2.0(XQuery的子集)的表達來完成:

substring($fullPath, 
      1, 
      string-length($fullPath) - string-length(tokenize($fullPath, '/')[last()]) 
     ) 

其中$fullPath應與實際的字符串被取代,如

"/db/Liebherr/Content_Repository/Techpubs/Topics/HyraulicPowerDistribution/Released/TRN_282C_HYD_MOD_1_Drive_Shaft_Rev000.xml" 
+0

好的,但爲什麼你會喜歡這個變種使用一個調用fn:replace? – Gunther

+0

@Gunther:不知何故。我總是喜歡分析解決方案的生成。我的解決方案只是分解 - 它不會修改或構建一些尚不存在的東西。無論如何,RegEx可能會很快變得無法讀取,並且是一個潛在的災難。 –

+0

@DimitreNovatchev:謝謝。 – Kevin

1

以下代碼標記化,刪除最後一個標記,用空字符串替換它並加入。

string-join(
    (
    tokenize(
     "/db/Liebherr/Content_Repository/Techpubs/Topics/HyraulicPowerDistribution/Released/TRN_282C_HYD_MOD_1_Drive_Shaft_Rev000.xml", 
     "/" 
    )[position() ne last()], 
    "" 
), 
    "/" 
) 

它似乎在try.zorba-xquery.com上返回所需的結果。這有幫助嗎?

2

嘗試使用tokenize()函數(用於將字符串拆分爲其組成部分),然後重新組裝它,使用除最後一部分以外的所有內容。

let $full-path := "/db/Liebherr/Content_Repository/Techpubs/Topics/HyraulicPowerDistribution/Released/TRN_282C_HYD_MOD_1_Drive_Shaft_Rev000.xml", 
    $segments := tokenize($full-path,"/")[position() ne last()] 
return 
    concat(string-join($segments,'/'),'/') 

有關這些功能的更多詳細信息,請參閱相關參考:

+0

@_Evan:可以不用'string-join()':)完成 –

+0

@DimitreNovatchev:是的,但是我爲什麼要? :) –

+0

@_Evan:我在問自己一個類似的問題:爲什麼要在地球上,我想修改或構建已經存在的東西? –

2

fn:replace可以用正則表達式做的工作:

replace("/db/Liebherr/Content_Repository/Techpubs/Topics/HyraulicPowerDistribution/Released/TRN_282C_HYD_MOD_1_Drive_Shaft_Rev000.xml", 
     "[^/]+$", 
     "")