2013-05-31 1 views
0

Как изменить все требуемые значения атрибутов таким образом, который выражен в XML-примерах с помощью Xquery?Изменение всех значений атрибутов элемента с помощью Xquery

Я использую базовый движок Basex 7.6 Xquery и XML. Моя цель до сих пор заключалась в том, чтобы обрабатывать только XML-файлы.

Эта структура у меня уже:

 <address ref="file1" title="title1"> 
     <address ref="file1.1" title="title1.1"> 
      <address ref="file1.1.1" title="title1.1.1"/> 
     </address> 
     <address ref="file1.2" title="title1.2"> 
      <address ref="file1.2.1" title="title1.2.1"/> 
      <address ref="file1.2.2" title="title1.2.2"> 
      <address ref="file1.2.2.1" title="title1.2.2.1"/> 
      <address ref="file1.2.2.2" title="title1.2.2.2"/> 
      </address> 
     </address> 
     </address> 
     <address ref="file2" title="title2"/> 

Но мне нужно иметь, как следующее:

 <address ref="mydir/file1" title="title1"> 
     <address ref="mydir/file1.1" title="title1.1"> 
      <address ref="mydir/file1.1.1" title="title1.1.1"/> 
     </address> 
     <address ref="mydir/file1.2" title="title1.2"> 
      <address ref="mydir/file1.2.1" title="title1.2.1"/> 
      <address ref="mydir/file1.2.2" title="title1.2.2"> 
      <address ref="mydir/file1.2.2.1" title="title1.2.2.1"/> 
      <address ref="mydir/file1.2.2.2" title="title1.2.2.2"/> 
      </address> 
     </address> 
     </address> 
     <address ref="mydir/file2" title="title2"/> 

мне удалось изменить первый элемент так, как я хотел, но все еще может «Правильно, как движок Xquery принимает.

Я изменил первый элемент с помощью этого фрагмента кода в BaseX 7.6, и я не понял, как применить его ко всем элементам.

 copy $c := 
       (<address ref="file1" title="title1"> 
        <address ref="file1.1" title="title1.1"> 
         <address ref="file1.1.1" title="title1.1.1"/> 
        </address> 
        <address ref="file1.2" title="title1.2"> 
         <address ref="file1.2.1" title="title1.2.1"/> 
         <address ref="file1.2.2" title="title1.2.2"> 
         <address ref="file1.2.2.1" title="title1.2.2.1"/> 
         <address ref="file1.2.2.2" title="title1.2.2.2"/> 
         </address> 
        </address> 
        </address> 
       (:<address ref="file2" title="title2"/> WHY IS THIS NOT BY THE WAY ACCEPTED?:) 

       ) 
       modify (
        replace value of node $c/@ref with concat('mydir/', $c/@ref) 
       ) 
       return $c 

информация о том, как я пытался понять эту проблему, можно найти здесь: http://docs.basex.org/wiki/XQuery_Update#Non-Updating_Expressions

Я чувствую себя, что Basex это хороший инструмент для этого. Я просто не могу понять, как это сделать. Я думаю, что рекурсия как-то тоже ответит в этом случае. Тем не менее я не могу понять это из-за моей маленькой неопытности.

Заранее благодарен!

ответ

0

Это предварять mydir/ для каждого атрибута в исх данных XML

copy $c := (<root> 
     <address ref="file1" title="title1"> 
     <address ref="file1.1" title="title1.1"> 
      <address ref="file1.1.1" title="title1.1.1"/> 
     </address> 
     <address ref="file1.2" title="title1.2"> 
      <address ref="file1.2.1" title="title1.2.1"/> 
      <address ref="file1.2.2" title="title1.2.2"> 
      <address ref="file1.2.2.1" title="title1.2.2.1"/> 
      <address ref="file1.2.2.2" title="title1.2.2.2"/> 
      </address> 
     </address> 
     </address> 
     <address ref="file2" title="title2"/> 
     </root>) 
    modify (
    for $e in $c//@ref 
    return replace value of node $e with concat('mydir/', $e) 
) 
    return $c 

Второй address узел не работает, потому что в XML, вы должны иметь ровно один корневой узел. Если вам нравится, вы можете использовать последовательность , то есть (<address />, <address2 />)

+0

Спасибо! Я знал, что я не далеко от решения, но все-таки нужен последний удар :) – sailfish

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