2012-01-23 34 views
5

我正在使用XPATH從XML文檔中選擇某些節點。XPath小寫()函數

用戶可以插入該位置的值。它工作正常,但如果使用不同的情況,則不起作用。

我已經決定在比較之前將XML值和用戶輸入更改爲小寫都可能是最好的方法。

我有了這個作爲我選擇的那一刻:

NodeIter = nav.Select("/Houses/House/location[contains(../location, '" + location_input + "')]"); 

我試圖把lower-case()功能在不同的地點,但它是不是滿意。

我該如何使../location的值比較爲小寫?

注意:location_input設置爲使用我的c#代碼中的ToLower()

+1

你是什麼意思「它不滿意」? – BoltClock

回答

17

lower-case()函數只支持從XPath 2.0開始。如果你的環境支持這個版本的標準,你可以寫:

NodeIter = nav.Select("/Houses/House/location[contains(lower-case(.), '" 
    + location_input + "')]"); 

然而,你有可能被XPath 1.0卡住了。在這種情況下,你可以濫用translate()功能:

NodeIter = nav.Select("/Houses/House/location[contains(translate(., " 
    + "'ABCDEFGHIJKLMNOPQRSTUVWXYZ', 'abcdefghijklmnopqrstuvwxyz'), '" 
    + location_input + "')]"); 
4

translate(../location, 'ABCDEFGHIJKLMNOPQRSTUVWXYZ', 'abcdefghijklmnopqrstuvwxyz'),如果你可以逃脫只是AZ

2

lower-casehttp://www.w3.org/TR/xpath-functions/#func-lower-case是2.0的XPath和XQuery 1.0的一部分,所以你需要使用XPath 2.0或XQuery 1.0實現像XQSharp或類似撒克遜9的.NET版本如果你想使用這樣的功能。

XPath 1.0所有你能做的是NodeIter = nav.Select(string.Format("/Houses/House/location[contains(translate(., 'ABCDEFGHIJKLMNOPQRSTUVWXZY', 'abcdefghijklmnopqrstuvwxyz'), '{0}')]", location_input));

2

注意,嚴格來說,翻譯兩個字符串,以降低(或上)的情況下是不能做的情況下,盲目的比較正確的方法,因爲映射Unicode中的小寫字母到大寫字母不是一對一的。原則上,在XPath 2.0中,您應該使用案例盲分類。不幸的是,雖然許多XSLT 2.0和XQuery 1.0處理器允許您使用案例盲分類,但沒有整理分類URI的標準,因此您的代碼變得與處理器相關。

0

我有使用VS2017同樣的困境(NetFramework 4.6.1)並安裝XPath2 NuGet包。到目前爲止,在使用XPath2函數時它對我來說工作得很好。