Стандартная библиотека.Net, поддерживающая XPath 3.1

Я поддерживаю устаревший инструмент компании, для которой я работаю, написанную на C#, и я конвертирую ее в стандарт.Net 2.0. Он использует процессор Saxon-HE для обработки некоторых XPath-файлов и замены некоторых конфигураций в файлах. Его пакет NuGet для.NET имеет зависимости, которые не позволяют выполнять все платформы, соответствующие стандарту.Net 2.0 (в моем случае - и.Net Framework, и ядро ​​.Net), поэтому мне нужно заменить его другим инструментом, лучше, если стандартная библиотека.Net XPath.

Проблема заключается в том, что инструмент использует некоторые XPath, которые выполняют сложные операции, такие как объединение строк и выбор элемента массива, и я не знаю, является ли это синтаксисом, специфичным для саксонского языка, или стандартом.

Это важно знать, потому что если XPath-ы соответствуют какому-либо стандарту XPath, я мог бы найти другой способ обработки тех же XPath-ов.

Вот несколько примеров:

Первый:

for $row in /Item/SubItem[*]/SubSubItem return(concat($row, \"/ConcatValue\"))

Во-вторых:

/Item/SubItem[*]/SubSubItem/(add[@key=\"TheKey\"]/@value/string(), '')[1]

Знаете ли вы что-нибудь об этом синтаксисе XPath?

Спасибо

2 ответа

Решение

Благодаря этому комментарию я смог протестировать XPath2.Net и теперь все работает. Мне нужно было изменить только один тип определения XPath

Вот этот:

/Item/SubItem[*]/SubSubItem/(add[@key=\"TheKey\"]/@value/string(), '')[1]

Изменения в

/Item/SubItem[*]/SubSubItem/(add[@key=\"TheKey\"]/@value/string(.), '')[1]

Обратите внимание на дополнительный аргумент точки string() функция. Это странно, так как не нужно указывать точку; фактически по стандарту

В версии функции с нулевым аргументом $arg по умолчанию является элементом контекста. То есть вызов fn:string() эквивалентен вызову fn:string(.)

но XPath2 жалуется с этой ошибкой

{"The function 'string'/0 was not found in namespace 'http://www.w3.org/2003/11/xpath-functions'"}

ОБНОВИТЬ:

После обновления библиотеки XPath2.Net до версии 1.0.8 string() Синтаксис работает.

Для выражений XPath, которые вы привели в качестве примеров, требуется процессор XPath 2.0, но они не относятся к Saxon.

Выражение

for $row in /Item/SubItem[*]/SubSubItem return(concat($row, \"/ConcatValue\"))

это ForExpression, которая специфична для XPath 2.0, и ее нелегко преобразовать в XPath 1.0, поскольку ее результатом является последовательность строк, а в XPath 1.0 такого типа данных нет.

Выражение

/Item/SubItem[*]/SubSubItem/(add[@key=\"TheKey\"]/@value/string(), '')[1]

специфичен для XPath 2.0, поскольку он использует выражение в скобках в правой части оператора "/"; и снова, потому что он возвращает последовательность строк.

Боюсь, я не могу сообщить вам, существуют ли библиотеки XPath 2.0, работающие на.NET Core, что, как я полагаю, является вашим требованием. Нельзя заставить Saxon работать на.NET Core из-за его зависимости от IKVM, которая не поддерживает эту платформу и которую (насколько я понимаю) нельзя легко приспособить для этого.

Обратите внимание, что XPath 2.0 является подмножеством XQuery 1.0, поэтому вы можете расширить поиск как на процессоры XQuery 1.0, так и на процессоры XPath 2.0.

Другие вопросы по тегам