2010-12-14 6 views
4

Опытный образец моего файла XML показан ниже:XQuery обратный текстовый узел, если он содержит данное ключевое слово

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 это ключевое слово, например, как 'Link')

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». Почему это?

+0

Я заменил '$ food_doc' декларацию как'/', исправляется' $ libapp_matchkey' опечатка, и успешно запущенной его с входной выборки , – 2010-12-14 21:43:31

+0

Хороший вопрос, +1. См. Мой ответ для короткого и естественного однострочного решения :) –

ответ

6

Я хочу написать запрос 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> 

разыскиваемый, правильный результат получается:

Link ISBN 
+0

Я вижу следующее исключение, когда я пытаюсь это сделать: для $ entry в $ feeds_doc/atom: feed/atom: entry return/*/$ entry [libx: libapp]/title [содержит (., 'Link')]/text() Исключение в потоке «main» java.io.IOException: остановлено в строке 9, столбец 13: [XPDY0002] Нет контекстного элемента для «root()». – sony

+0

@sony: В моем ответе нет «$ entry». Вы можете получить любое возможное исключение во всем, что не является моим ответом, но почему вы сообщаете об этом в качестве комментария здесь? –

+1

Что означает/* ссылка? Я имею в виду, что элементы входа находятся внутри элемента в документе. Как вы ссылаетесь на $ feeds_doc/feed – sony

Смежные вопросы