Как вывести узел XML с тем же именем [несколько экземпляров] с помощью XQuery

My XML Response Load appears as below


       <entries>
            <id>1</id>
            <UseCountIds>100</UseCountIds>
            <UseCountIds>200</UseCountIds>
            <UseCountIds>300</UseCountIds>
      </entries>

Здесь «записи» - это родительский узел, у которого есть дочерние элементы, а именно «id», «UseCountIds». Выше пример для id = 1. Точно так же есть много «записей» для id = 2, id = 3 и т. Д.

id - это своего рода уникальное значение.

Я выполнил XQuery для извлечения дочерних элементов из XML Payload. Ниже используется Xquery.

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

Проблема в том, что с указанным выше выводом XQuery, если он загружается в файл .csv, он отображается как

                   id,UseCountIds
                   1,100 200 300

UseCountIds (несколько значений) отображаются в столбце с разделителями пробелами.

Мое требование - получить желаемый результат, как показано ниже

                   id,UseCountIds
                   1,100
                   1,200
                   1,300

Кроме того, UseCountIds не ограничивается только тремя вхождениями. Для уникального 'id' может быть 'n' нет. UseCountIds.

Всегда полезно связать UseCountIds с уникальным идентификатором на уровне строки.

Поделитесь своими мыслями о том, как настроить XQuery для получения желаемого результата, упомянутого выше.

Спасибо, ТГ


person Tom George    schedule 05.04.2017    source источник
comment
Записи имеют множественное число, и я предполагаю, что полезная нагрузка XML может включать более одной записи. Если да, то приведите более полный пример. Кроме того, возможно ли, чтобы значение useCountIds повторялось более одного раза для записи? Если да, то дубликаты показывать или нет?   -  person David Ennis    schedule 05.04.2017


Ответы (1)


Непонятно, как вы генерируете CSV из вывода XQuery, но, если я могу предположить, что вам просто нужен один элемент entries для каждого UseCountIds в исходном XML, чтобы он создавал желаемые данные CSV, тогда это один из возможных XQuery:

for $c in /root/entries/UseCountIds
return
<entries>
{
    $c/preceding-sibling::id,
    $c
}    
</entries>

Если не удалось получить желаемый результат, опубликуйте, каким должен быть вывод XQuery.


Чтобы иметь возможность возвращать entries, даже если нет дочернего UseCountIds:

for $e in /root/entries
let $id := $e/id
let $useCountIds := $e/UseCountIds
return
    if($useCountIds) then
        for $c in $useCountIds
        return
            <entries>
            {
                $id,
                $c
            }
            </entries>
    else 
        <entries>
        {
            $id,
            <UseCountIds></UseCountIds>
        }
        </entries>

demo

person har07    schedule 05.04.2017
comment
Привет, har07, я пробовал это. К сожалению, происходит то, что весь набор «UseCountIds» привязан к одному значению «id». то есть всего 100 UseCountIds. Каждое значение id возвращается 100 UseCountIds. - person Tom George; 05.04.2017
comment
Можете опубликовать, каким должен быть вывод XQuery, чтобы нам не нужно было знать, как вы конвертируете результат XQuery в CSV? - person har07; 05.04.2017
comment
с X Query, который я использовал (упомянутый в Q), я получаю результат, как показано ниже ‹entries› ‹id› 1 ‹/id› ‹UseCountIds› 100 200 300 ‹/UseCountIds› ‹/entries› Если вы видите это, 'UseCountIds 'объединяются в одноэлементный узел. Это потому, что имя элемента одинаковое, но с разными значениями. UseCountIds - необязательный столбец. Он не будет доступен со всеми идентификаторами. Я использовал «data ()», чтобы получить пустое значение, даже если «UseCountIds» не присутствует для определенного «id». Точно так же я получу все записи id независимо от значения, представленного в UseCountIds. - person Tom George; 05.04.2017
comment
Преобразование CSV выполняется утилитой, которая ожидает, что вход будет в виде ‹entries› ‹id› 1 ‹/id› ‹UseCountIds› 100 ‹/UseCountIds› ‹UseCountIds› 200 ‹/UseCountIds› ‹UseCountIds› 300 ‹/UseCountIds› ‹ / записи › - person Tom George; 05.04.2017
comment
Первоначальный XQuery, который я опубликовал, должен был возвращать результат в таком формате, только в случае из entries без какого-либо UseCountIds дочернего элемента .. проверьте обновленный ответ - person har07; 05.04.2017
comment
Поскольку вы еще никогда этого не делали: примите ответ которые решают рассматриваемую проблему. Спасибо - person har07; 05.04.2017