Xquery копирует все «содержимое» элемента (text () + все дочерние узлы) в новый элемент - PullRequest
1 голос
/ 13 мая 2019

В Xquery 3.1 я преобразую XML-файл (содержащий данные, которые изначально хранились в таблицах SQL) в другой формат XML-файла.Обычно это довольно просто, но для одного конкретного элемента я хотел бы скопировать text(), а также любые узлы child и их содержимое в новый элемент.Например, я хочу преобразовать следующий XML:

<table tablename="collections">
  <record id="1">
    <field fieldname="id">1</field>
    <field fieldname="title">Quisque elementum cursus nunc non aliquam</field>
    <field fieldname="desc">Quisque elementum cursus nunc non aliquam; 
        also known under the title <i>Lorem ipsum dolor sit amet</i>.<br/> The 
       same author compiled a large encyclopedia <i>Liber de natura 
       rerum,</i> synthesizing much knowledge from his period.</field>
    <field fieldname="author">Thomas de Cantimpré</field>
   </record>
 </table>

в:

 <list xml:id="collections">
   <item n="1">
    <list>
     <item type="title">Quisque elementum cursus nunc non aliquam</item>
     <item type="desc">Quisque elementum cursus nunc non aliquam; 
        also known under the title <i>Lorem ipsum dolor sit amet</i>.<br/> The 
       same author compiled a large encyclopedia <i>Liber de natura 
       rerum,</i> synthesizing much knowledge from his period.</item>
     <item type="author">Thomas de Cantimpré</item>
    </list>
    </item>
 </list>

Как правило, большая часть этого не представляет проблемы.Однако я нахожусь в тупике по проблеме получения text() и всех child узлов внутри элемента <field fieldname="desc">.Решение в XPATH ускользнуло от меня.

Заранее благодарим за любой совет.

1 Ответ

3 голосов
/ 13 мая 2019

Ваше словесное описание «всего содержимого» будет представлять собой все дочерние узлы в терминологии XPath, и текстовые узлы, конечно, также являются дочерними узлами элемента, подобно тому, как дочерние элементы являются дочерними узлами. Чтобы выбрать все дочерние узлы контейнерного узла, вам просто нужно node() в контексте контейнерного узла, например, /table/record/field[@fieldname="desc"]/node() выбирает все дочерние узлы элемента field fieldname="title" входной выборки.

...