XPath строчная () функция - PullRequest
       32

XPath строчная () функция

5 голосов
/ 23 января 2012

Я использую XPATH для выбора определенных узлов из документа XML.

Пользователь может вставить значение для местоположения.Он работает нормально, но не работает, если используются разные регистры.

Я решил, что изменение значений XML и ввода пользователя в нижний регистр перед сравнением, вероятно, лучший способ сделать это..

В данный момент у меня есть селектор:

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

Я пытался разместить функцию lower-case() в разных местах, но это не устраивает.

Как мне сделать так, чтобы значение ../location сравнивалось в нижнем регистре?

Примечание: location_input устанавливается на более низкое значение, используя ToLower() в моем коде c #.

Ответы [ 6 ]

17 голосов
/ 23 января 2012

Функция в нижнем регистре () поддерживается только начиная с 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 + "')]");
5 голосов
/ 23 января 2012

translate(../location, 'ABCDEFGHIJKLMNOPQRSTUVWXYZ', 'abcdefghijklmnopqrstuvwxyz'), если вы можете уйти только с A-Z

2 голосов
/ 24 января 2012

Обратите внимание, что, строго говоря, перевод двух строк в нижний (или верхний) регистр не является правильным способом сравнения без учета регистра, поскольку отображение символов нижнего регистра в верхний регистр в Unicode не является однозначным-один.В принципе, в XPath 2.0 вы должны использовать слепую сортировку.К сожалению, хотя многие процессоры XSLT 2.0 и XQuery 1.0 позволяют использовать сортировку без учета регистра, стандартов для URI сортировки не существует, поэтому ваш код становится зависимым от процессора.

2 голосов
/ 23 января 2012

lower-case http://www.w3.org/TR/xpath-functions/#func-lower-case является частью XPath 2.0 и XQuery 1.0, поэтому вам нужно использовать реализацию XPath 2.0 или XQuery 1.0, такую ​​как XQSharp или как .NET-версию Saxon 9, если вы хотите использовать такие функции.

С XPath 1.0 все, что вы можете сделать, это NodeIter = nav.Select(string.Format("/Houses/House/location[contains(translate(., 'ABCDEFGHIJKLMNOPQRSTUVWXZY', 'abcdefghijklmnopqrstuvwxyz'), '{0}')]", location_input));.

0 голосов
/ 02 марта 2018

У меня была та же самая дилемма с использованием VS2017 (NetFramework 4.6.1) и я установил пакет XPath2 NuGet. До сих пор это работало нормально для меня при использовании функций XPath2.

0 голосов
/ 04 февраля 2016

Пока вы имеете дело с .net, вы можете использовать расширение Microsoft для сравнения без учета регистра: мс: сравнение строк

https://msdn.microsoft.com/en-us/library/ms256114(v=vs.120).aspx

...