2014-10-07 25 views
1

System.IO.Path.Combine允許將諸如C:\Users\PeterDesktop\photo.jpg的路徑組合成C:\Users\Peter\Desktop\photo.jpg。串聯過程中對路徑分隔符的智能處理是其主要優點之一:無論第一個路徑末尾是否存在\,連接總是運行良好。是否存在與System.IO.Path.Combine()類似的XPath串聯操作?

是否有一些類似的機制可用於Xpath?

預期的行爲:
/Customer/Order + LineItem/Description/text() =>/Customer/Order/LineItem/Description/text()

+2

如果XPath沒有動態評估,串聯兩個路徑表達式有什麼意義? – 2014-10-07 22:51:07

+0

我希望我可以upvote @基里爾的答案,這是自動和錯誤地標記爲不提供答案。邁克麥考恩,讓票決定。質量低下,或「使用量低於預期」,與「不是答案」不一樣。 – LarsH 2014-10-08 03:00:53

+0

@LarsH即使技術上是正確的,「這是不可能」的答案應該至少提供一些關於_why_這是不可能的證據。否則,它不符合答案的標準,並且屬於評論部分。邁克·麥考恩在9個小時前說了基本上相同的事情。 – JLRishe 2014-10-08 07:55:11

回答

2

您使用的.NET代碼,從而得出我你堅持使用XPath 1.0。

級聯固定數目的原子的字符串的是容易在的XPath 1.0通過使用concat($string1, $string2, ..., $stringN),例如

concat('/Customer/Order', '/', 'LineItem/Description/text()') 

然而,這需要知識拖尾斜線是否存在或不存在。 XPath 1.0並不真正瞭解大小寫區別,並且字符串處理能力非常有限,但您仍然陷入了相當難看的謂詞攻擊和重複字符串。

concat('/Customer/Order', 
     '/'['/' != substring('/Customer/Order', string-length('/Customer/Order'))], 
     'LineItem/Description/text()' 
) 

使用新引進的ends-with(...)功能的if-then-else子句使用的XPath 2.0,你可以不喜歡

concat('/Customer/Order', 
     if (ends-with('/Customer/Order', '/')) 
     then '' 
     else '/', 
     'LineItem/Description/text()' 
) 

還是有點短

concat('/Customer/Order', 
     '/'[not(ends-with('/Customer/Order', '/'))], 
     'LineItem/Description/text()' 
) 

最後使用帶有單個項目循環的hack刪除重複變量的要求:

for $string in '/Customer/Order' 
return 
    concat($string, 
     '/'[not(ends-with($string, '/'))], 
     'LineItem/Description/text()' 
) 

結論:不考慮 「複雜」 的字符串操作中的XPath,特別是沒有的XPath 1.0。 XPath 2.0看起來更好,使用XQuery也很有趣。

相關問題