2013-08-05 2 views
0

Я пытаюсь заменить узел некоторым текстом вместе с дочерним узлом внутри него. Ниже мой XQuery. Я не получаю желаемого результата.XQuery для вставки родительских и дочерних узлов

for $x in collection('articles')//Doc[Title/@No='Article 20'] 
    return replace value of node $x/Desc with "Article on Molecular Physics 
    <Date @d='20130805'/> in continuation with Part 1." 

Expecting-

.... 
<Desc>Article on Molecular Physics 
    <Date @d='20130805'/> in continuation with Part 1.</Desc> 
.... 

Но я getting-

.... 
<Desc>Article on Molecular Physics 
    &lt;Date @d='20130805'/&gt; in continuation with Part 1.</Desc> 
.... 

ответ

1

Чтобы получить желаемый результат, я сначала удалил узел, а затем вставить его следующим образом-

let $c := <Desc>Article on Molecular Physics <Date d='20130805'/> in continuation with Part 1.</Desc> 
for $x in collection('articles')//Doc[Title/@No='Article 20'] 
    return 
    (
     delete node $x/Desc, 
     insert node $c after $x/Title 
    ) 

Это сработало для меня :)

0

Потому что вы в том числе новый XML-элемент в строке, он проходит лечение, как один; т.е. экранировано. Попробуйте заменить строку с последовательностью узлов, которые вы хотите в элементе, например, так:

for $x in collection('articles')//Doc[Title/@No='Article 20'] 
    return replace value of node $x/Desc with 
    ("Article on Molecular Physics ", <Date d='20130805'/>, " in continuation with Part 1.") 
+1

Спасибо за ответ. Но не получить желаемого результата. '' Статья о молекулярной физике ''вводится только эта часть :( – John

+0

А справа - похоже, что вы не можете предоставить структурированный XML в аргументах' replace value' (и заставить его делать то, что вы хотите); не очень. Похоже, у вас есть лучшее решение в вашем собственном ответе. –

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