Удаление узла с помощью XQuery Update - PullRequest
2 голосов
/ 24 сентября 2010

Я пытаюсь удалить дочерний узел из родительского узла с помощью xquery.Скажем, у меня есть запись, показанная ниже в моем xml:

 <entry>
        <id>36</id>
        <title>Engineering Village Author Tool</title>
        <updated>2009-09-30T12:55:42Z</updated>
        <libx:libapp>
          <libx:entry xmlns:libx="http://libx.org/xml/libx2" src="37"/>
        </libx:libapp>
      </entry>

Как удалить дочерний узел

<libx:entry xmlns:libx="http://libx.org/xml/libx2" src="37"/>

Я использую следующий код xquery:

declare namespace libx='http://libx.org/xml/libx2';
declare namespace atom='http://www.w3.org/2005/Atom';
declare variable $child_id as xs:string external;
declare variable $parent_id as xs:string external;
declare variable $doc_name as xs:string external;
declare variable $feed      as xs:anyAtomicType := doc($doc_name)/atom:feed;
let $parent_entry := $feed/atom:entry[atom:id=$parent_id]
return delete node $parent_entry//libx:entry[@libx:src=$child_id]

Значения передаваемых здесь переменных: child_id = 37 parent_id = 36 doc_name = имя используемого документа

Я предполагаю, что что-то не так с тем, как я использую пространства имен или выражение xpathя использую в своем xquery в строке:

return delete node $parent_entry//libx:entry[@libx:src=$child_id]

Пожалуйста, помогите мне исправить это.

Ответы [ 2 ]

2 голосов
/ 24 сентября 2010

Вы объявляете $feed as xs:anyAtomicType, но вы устанавливаете его и используете как node().

Я на самом деле удивлен, что запрос компилируется. Попробуйте удалить xs:anyAtomicType или заменить его на element().

Также вы хотите, чтобы @src выбирал ваш дочерний узел, а не @libx:src. Так

declare namespace libx='http://libx.org/xml/libx2';
declare namespace atom='http://www.w3.org/2005/Atom';
declare variable $child_id as xs:string external;
declare variable $parent_id as xs:string external;
declare variable $doc_name as xs:string external;
declare variable $feed := doc($doc_name)/atom:feed;
let $parent_entry := $feed/atom:entry[atom:id=$parent_id]
return delete node $parent_entry//libx:entry[@src=$child_id]
0 голосов
/ 24 сентября 2010

Не зная, что вывод или ошибка, я бы предположил, что $ parent_node установлен неправильно;то есть запрос $feed/atom:entry[atom:id=$parent_id] ничего не возвращает.Я бы попробовал $feed/entry[id=$parent_id] для развлечения.Кроме того, убедитесь, что $ feed также установлен правильно, а также попробуйте удалить «atom:» из оператора declare variable $feed.

Что касается оператора печати (предположительно для отладки), это, вероятно, специфичнопоставщику базы данных, которую вы используете.Если вы все еще используете BaseX, запустите этот запрос из командной строки и добавьте «-v» для вывода.Теперь, когда я снова посмотрю на этот код, я удивляюсь, почему я использовал let $parent_entry... вместо declare variable $parent_entry....

xquery - это боль, не так ли?

...