2012-01-23 26 views
5

Tôi đang sử dụng XPATH để chọn các nút nhất định từ một tài liệu XML.Hàm hạ thấp XPath()

Người dùng có thể chèn giá trị cho vị trí. Nó hoạt động tốt, nhưng nó không hoạt động nếu các trường hợp khác nhau được sử dụng.

Tôi đã quyết định thay đổi cả giá trị XML và đầu vào của người dùng thành trường hợp thấp hơn trước khi được so sánh có lẽ là cách tốt nhất để thực hiện.

Tôi đã có này như chọn của tôi vào lúc này:

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

Tôi đã thử đặt lower-case() chức năng tại các địa điểm khác nhau, nhưng nó không phải là hạnh phúc với nó.

Làm cách nào để làm cho giá trị của ../location được so sánh với trường hợp thấp hơn?

Lưu ý: location_input được đặt thành thấp hơn bằng cách sử dụng ToLower() trong mã C# của tôi.

+1

Ý của bạn là gì bởi "nó không hài lòng với nó"? – BoltClock

Trả lời

17

Chức năng lower-case() chỉ được hỗ trợ từ XPath 2.0 trở đi. Nếu môi trường của bạn hỗ trợ phiên bản tiêu chuẩn này, bạn có thể viết:

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

Tuy nhiên, rất có thể bạn đang mắc kẹt với XPath 1.0. Trong trường hợp đó, bạn có thể lạm dụng translate() chức năng:

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

translate(../location, 'ABCDEFGHIJKLMNOPQRSTUVWXYZ', 'abcdefghijklmnopqrstuvwxyz') nếu bạn có thể nhận được ngay với chỉ AZ

2

lower-casehttp://www.w3.org/TR/xpath-functions/#func-lower-case là một phần của XPath 2.0 và XQuery 1.0, do đó bạn cần phải sử dụng một XPath 2.0 hoặc XQuery 1.0 thực hiện như XQSharp hoặc giống như phiên bản .NET của Saxon 9 nếu bạn muốn sử dụng các chức năng như vậy.

Với XPath 1.0, tất cả những gì bạn có thể làm là NodeIter = nav.Select(string.Format("/Houses/House/location[contains(translate(., 'ABCDEFGHIJKLMNOPQRSTUVWXZY', 'abcdefghijklmnopqrstuvwxyz'), '{0}')]", location_input));.

2

Lưu ý rằng nói đúng, dịch hai chuỗi giảm (hoặc phía trên) trường hợp không phải là một cách chính xác để làm một so sánh trường hợp mù, bởi vì các bản đồ của chữ thường trong các ký tự chữ thường trong Unicode không phải là một-một. Về nguyên tắc, trong XPath 2.0, bạn nên sử dụng collation case-blind. Thật không may, mặc dù nhiều bộ vi xử lý XSLT 2.0 và XQuery 1.0 cho phép bạn sử dụng collation trường hợp mù, không có tiêu chuẩn cho các URI collation, do đó, mã của bạn trở nên phụ thuộc vào bộ xử lý.

0

tôi đã cùng tiến thoái lưỡng nan sử dụng VS2017 (NetFramework 4.6.1) và cài đặt gói XPath2 NuGet. Cho đến nay nó đã được làm việc tốt cho tôi khi sử dụng các hàm XPath2.

Các vấn đề liên quan