Как передать xpath в объявление функции xquery - PullRequest
2 голосов
/ 18 мая 2010

Я использую Apache Tomcat DB Exist в качестве базы данных XML и пытаюсь создать последовательность, передавая следующий xpath, определенный в предложении FLWOR 'let':

$xpath := $root/second/third

в объявлении локальной функции, например:

declare function local:someFunction($uuid as xs:string?, $xpath as xs:anyAtomicType?)
{
  let $varOne := $xpath/fourth[@uuid = $uuid]/fifthRight
  let $varTwo := $xpath/fourth[@uuid = $uuid]/fifthLeft
  let $combined := ($varOne,$varTwo)
  return $combined
};

Конечно, при вводе этого в существующую изолированную программную среду xquery я получаю Type: xs: anyAtomicType не определен. Что я должен использовать вместо этого, или я должен сделать это по-другому?

Заранее спасибо за любые предложения.

Ответы [ 2 ]

1 голос
/ 18 мая 2010

Я не смог воспроизвести ошибку (xs: anyAtomicType не определен). Тем не менее, может быть, следующее может помочь?

Если $ xpath (первоначально узел) передается в качестве параметра атомарного типа (таким образом, атомизируется), он определенно выдаст ошибку типа XPTY0019, когда вы попытаетесь перейти в своей функции ($xpath/fourth). Работает ли следующий код на вашей стороне (вместо node()*)?

declare function local:someFunction($uuid as xs:string?, $xpath as node()*)
{
  let $varOne := $xpath/fourth[@uuid = $uuid]/fifthRight
  let $varTwo := $xpath/fourth[@uuid = $uuid]/fifthLeft
  let $combined := ($varOne,$varTwo)
  return $combined
};

let $root :=
  <first>
    <second>
      <third>
        <fourth uuid="1">
          <fifthLeft>foo</fifthLeft>
          <fifthRight>bar</fifthRight>
        </fourth>
      </third>
    </second>
  </first>
let $xpath :=$root/second/third
return
local:someFunction("1", $xpath)

(Изменить: забыл звездочку, чтобы разрешить любое количество узлов)

0 голосов
/ 19 мая 2010

Выражение типа $ root / second / third в общем случае дает последовательность элементов, поэтому не следует думать о ней как о пути. Используя тип xs: anyAtomicType? принудит предметы к атому.

Вы можете упростить функцию до

declare function local:y($uuid as xs:string?, $xpath as item()*)
{
  $xpath/fourth[@uuid = $uuid]/(fifthRight,fifthLeft)
};

BTW eXist db - это независимый проект с открытым исходным кодом, не связанный с Apache или Tomcat, хотя он использует компоненты Apache, такие как Xalan и Lucene

...