Использование functx:index-of-match-first в XQuery для возврата подстроки текстового узла
Я пытаюсь написать XQuery, который найдет все текстовые узлы, которые содержат данное ключевое слово в файле XML. Текстовый узел длинный, поэтому я хотел бы вернуть подстроку (желаемой длины) текста, начиная с соответствующего ключевого слова.
Samplefile.xml
<books>
<book>
<title>linear systems</title>
<content>vector spaces and linear system analysis </content>
</book>
<book>
<title>some title</title>
<content>some content</content>
</book>
</books>
samplexquery.xq
declare namespace functx = "http://www.functx.com";
for $match_result in /*/book/*[contains(.,'linear')]/text()
return substring($match_result, functx:index-of-match-first($match_result,'linear'), 50)
Я ожидаю получить результат [линейные системы, линейный системный анализ]. Титульный узел первой книги содержит слово "линейный". Вернуть 50 символов, начиная с "линейный....". Аналогично для узла содержимого первой книги.
Я использую XQuery 1.0, и я включил пространство имен functx, как показано в примере по адресу: http://www.xqueryfunctions.com/xq/functx_index-of-match-first.html
Но это дает мне ошибку: [XPST0017] Неизвестная функция "functx:index-of-match-first(...)".
Спасибо Sony
1 ответ
Я использую XQuery 1.0, и я включил пространство имен functx, как показано в примере по адресу: http://www.xqueryfunctions.com/xq/functx_index-of-match-first.html
Но это дает мне ошибку: [XPST0017] Неизвестная функция "functx:index-of-match-first(...)".
Недостаточно только объявить пространство имен.
Вы также должны иметь код функции. Только стандартные функции и операторы XQuery и XPath предопределены в языке.
Это исправленный код:
declare namespace functx = "http://www.functx.com";
declare function functx:index-of-match-first
( $arg as xs:string? ,
$pattern as xs:string ) as xs:integer? {
if (matches($arg,$pattern))
then string-length(tokenize($arg, $pattern)[1]) + 1
else ()
} ;
for $match_result in /*/book/*[contains(.,'linear')]/text()
return substring($match_result, functx:index-of-match-first($match_result,'linear'), 50)
при применении к предоставленному документу XML (с исправлением нескольких ошибок неправильной формы):
<books>
<book>
<title>linear systems</title>
<content>vector spaces and linear system analysis </content>
</book>
<book>
<title>some title</title>
<content>some content</content>
</book>
</books>
дает ожидаемый результат:
linear systems linear system analysis
Хорошей практикой является использованиеimport module
директива для импорта модулей из существующих библиотек функций.