Мне нужна функция сопоставления регулярных выражений, но в XPath 1.0 такой функции нет.
Мне ничего не оставалось, как самому расширить его, и после поиска в Интернете нашла хорошую статью.
http://www.microsoft.com/china/MSDN/library/data/xml/AddingCustomFunctionstoXpath.mspx?mfr=true
В этой статье определены разделение и замена, но совпадения нет.
Мне пришлось расширить ее на основе этого.
Внимательно посмотрев код, я обнаружил, что расширить функцию очень просто, достаточно изменить эти абзацы:
1: CustomContext.cs.
// Функция для разрешения ссылок на мои пользовательские функции.
общедоступное переопределение IXsltContextFunction ResolveFunction (префикс строки,
имя строки, XPathResultType[] ArgTypes)
{
XPathRegExtensionFunction func = null;
// Создать экземпляр соответствующего класса функции расширения.
переключатель (имя)
{
чехол «Матч»:
//Использование
// myFunctions:Matches(источник строки, строка Regex_pattern) возвращает логическое значение
func = новый XPathRegExtensionFunction("Соответствие", 2, 2, новый
XPathResultType[] {XPathResultType.String, XPathResultType.String}
, XPathResultType.Boolean);
перерыв;
корпус «Сплит»:
//Использование
// myFunctions:Split(источник строки, строка Regex_pattern, int n) возвращает строку
func = новый XPathRegExtensionFunction("Split", 3, 3, новый
XPathResultType[] {XPathResultType.String, XPathResultType.String,
XPathResultType.Number}, XPathResultType.String);
перерыв;
случай «Заменить»:
//Использование
// myFunctions:Replace(источник строки, строка Regex_pattern, строка replace_string) возвращает строку
func = новый XPathRegExtensionFunction("Заменить", 3, 3, новый
XPathResultType[] {XPathResultType.String, XPathResultType.String,
XPathResultType.String}, XPathResultType.String);
перерыв;
}
возврат функции;
}
2: XPathRegExtensionFunction.cs
// Этот метод вызывается во время выполнения для выполнения определяемой пользователем функции.
публичный объект Invoke(XsltContext xsltContext, object[] args,
документ XPathNavigator)
{
регулярное выражение р;
строка стр = ноль;
// Две пользовательские функции расширения XPath
переключатель (m_FunctionName)
{
чехол «Матч»:
r = новое регулярное выражение(args[1].ToString());
MatchCollection m = r.Matches(args[0].ToString());
если (m.Count == 0)
{
вернуть ложь;
}
еще
{
вернуть истину;
}
перерыв;
корпус «Сплит»:
r = новое регулярное выражение(args[1].ToString());
string[] s1 = r.Split(args[0].ToString());
int n = Convert.ToInt32(args[2]);
если (s1.Length < n)
ул = "";
еще
стр = s1[n - 1];
перерыв;
случай «Заменить»:
r = новое регулярное выражение(args[1].ToString());
строка s2 = r.Replace(args[0].ToString(), args[2].ToString());
стр = с2;
перерыв;
}
возврат (объект)str;
}
Другой файл, XPathExtensionVariable.cs, на самом деле не имеет никакого отношения к расширению функций. Он используется для установки параметров.
После того, как эти два файла были изменены, вы можете вызвать:
query = navigator.Compile("xdUtil:Match(9,'\d')");
CustomContext cntxt = новый CustomContext();
// Добавляем определение пространства имен для префикса myFunctions.
cntxt.AddNamespace("xdUtil", " http://myXPathExtensionFunctions ");
query.SetContext(cntxt);
Оценить(запрос, навигатор);
Конечно, было бы здорово, если бы он поддерживал XPath2.0. Все эти функции XPath2.0 поддерживаются встроенно, но, к сожалению, похоже, они еще не поддерживаются.
Полный код здесь: