XQuery возвращает текстовый узел, если он содержит данное ключевое слово - PullRequest
4 голосов
/ 14 декабря 2010

Тестовый образец моего xml-файла показан ниже:

test.xml

<feed>
  <entry>
    <title>Link ISBN</title>
    <libx:libapp xmlns:libx="http://libx.org/xml/libx2" />
  </entry>
  <entry>
    <title>Link Something</title>
    <libx:module xmlns:libx="http://libx.org/xml/libx2" />
  </entry>
</feed>

Теперь я хочу написать xquery, который найдет все элементы <entry>, которые имеют<libx:libapp> как ребенок.Затем для всех таких записей вернуть заголовок, если заголовок содержит заданное ключевое слово (например, Ссылка).Итак, в моем примере XML-документа xquery должен возвращать «Link ISBN».

Мой пример xquery показан ниже:

samplequery.xq (здесь doc_name - это файл XML, показанный выше, а libapp_matchkey -ключевое слово, такое как «Ссылка»)

declare namespace libx='http://libx.org/xml/libx2';
declare variable $doc_name as xs:string external;
declare variable $libpp_matchkey as xs:string external;
let $feeds_doc := doc($doc_name)

for $entry in $feeds_doc/feed/entry
   (: test whether entry has libx:libapp child and has "Link" in its title child :)
   where ($entry/libx:libapp and $entry/title/text()[contains(.,$libapp_matchkey)])
    return $entry/title/text()

Этот xquery возвращает ноль вместо ожидаемого результата «Ссылка ISBN».Почему это?

1 Ответ

7 голосов
/ 15 декабря 2010

Я хочу написать xquery, который найдет все элементы, которые есть у ребенка.Затем для всех таких записей вернуть заголовок, если заголовок содержит данное ключевое слово (например, Ссылка).

Просто используйте :

/*/entry[libx:libapp]/title[contains(.,'Link')]/text()

Оборачивая это выражение XPath в XQuery, мы получаем :

declare namespace libx='http://libx.org/xml/libx2';
/*/entry[libx:libapp]/title[contains(.,'Link')]/text() 

при применении к предоставленному документу XML :

<feed> 
  <entry> 
    <title>Link ISBN</title> 
    <libx:libapp xmlns:libx="http://libx.org/xml/libx2" /> 
  </entry> 
  <entry> 
    <title>Link Something</title> 
    <libx:module xmlns:libx="http://libx.org/xml/libx2" /> 
  </entry> 
</feed>

theхотел, правильный результат выдается :

Link ISBN
...