XQuery для извлечения значений из дочерних узлов узла элемента, имеющего изменения имени для каждой записи XML - PullRequest
0 голосов
/ 29 августа 2018

Полезная нагрузка XML-ответа, как показано ниже

<root>
 <_1>
  <expand>description,lead,url,projectKeys</expand>
  <name>ABC</name>
  <id>12631</id>
</_1>
<_2>
  <expand>description,lead,url,projectKeys</expand>
  <name>XYZ</name>
  <id>12632</id>
</_2>
<_3>
  <expand>description,lead,url,projectKeys</expand>
  <name>JKL</name>
  <id>12634</id>
 </_3>
</root>

Здесь <_1>, <_ 2>, <_ 3> могут последовательно увеличиваться в зависимости от общего количества записей XML.

Мои требования - написать XQuery

  1. Чтобы определить общее количество значений в узлах Элемента (например, для: - 50 т. Е. Последний узел <_50>)

  2. Итерация по всем узлам элемента до 50 (например) и извлечение соответствующих дочерних узлов (например: раскрытие, имя, идентификатор)

    У меня была похожая полезная нагрузка XML-ответа, где вместо последовательного увеличения значений узлов элемента (<_1>, <_ 2>, <_ 3>) он имеет фиксированное имя (записи) для всех узлов элемента. (Пример ниже), и я написал XQuery для извлечения значений из его дочерних узлов (см. Ниже).

     <root>
      <entries>
      <added>1534815831000</added>
      <updated>1534815831000</updated>
      </entries>
     <entries>
      <added>1534815832000</added>
      <updated>1534815832000</updated>
      </entries>
      </root>
    

XQuery был

 let $entries := /root/entries
  return
  for $entry in $entries
  return
    <entries>
     {
    <added>{data($entry/added)}</added>,
    <updated>{data($entry/updated)}</updated>
     }
    </entries>

Проблемы

a) Когда имя узла элемента изменяется с каждой записью

b) Итерация по всем элементам

Любые ценные предложения приветствуются.

Спасибо

Ответы [ 2 ]

0 голосов
/ 29 августа 2018

Получение количества записей просто count(/root/*).

Копирование первых 50 записей просто subsequence(/root/*, 1, 50).

Копирование первых 50 записей при сохранении только дочернего элемента name равно

for $e in subsequence(/root/*, 1, 50)
return element{local-name($e)}{$e/name}
0 голосов
/ 29 августа 2018

Вы можете выбрать первые 50 элементов с помощью фильтра предикатов: /root/*[1 to 50]

Вы также можете использовать позиционную переменную при итерации набора entry элементов, предложение where в FLWOR, чтобы ограничиться первыми 50, и скопировать все $entry/* дочерние элементы вместо их восстановления:

for $entry at $i in /root/*
where $i <= 50
return
 element { $entry/local-name() } { 
   $entry/name 
 }
...