Использование functx: index-of-match-first в XQuery для возврата подстроки текстового узла - PullRequest
4 голосов
/ 17 декабря 2010

Я пытаюсь написать 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 и включил функцию пространства имен, как показано в примере по адресу: http://www.xqueryfunctions.com/xq/functx_index-of-match-first.html

Но это дает мне ошибку: [XPST0017] Неизвестная функция "functx: index-of-match-first (...)".

Спасибо, Sony

1 Ответ

2 голосов
/ 17 декабря 2010

Я использую 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 для импорта модулей из существующих библиотек функций .

...