Стандартная библиотека.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.