2016-07-19 4 views
0

У меня есть требование, когда узел элемента XML говорит, что «UseCountIds» имеет несколько вхождений и с несколькими значениями. Поскольку имя узла узла остается таким же, я должен различать каждый из них как UseCountIds1, UseCountIds2, UseCountIds3.Как выводить узел XML с тем же именем [несколько вхождений], но разные значения с помощью XQuery

На данный момент он оборудован только 3 случаями.

Ответная информация появляется как показано ниже. На каком этапе будет выполняться Xquery.

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

Использование Xquery ожидается вывод в файл с разделителями.

 Output File 
     id,UseCountIds1,UseCountIds2,UseCountIds3 
     1,100,200,300 

Ожидая ваших ценных мыслей.

+0

В принципе, вы ищете, чтобы одни и те же узлы элементов были уникальными. Кроме того, если данные не доступны для всех узлов или других, пусть они выводятся как пустые или значения по умолчанию. –

ответ

1

Если тег структура вашего ввода XML является фиксированной и только значения переменные, то простейший запрос будет

concat(
    "id,UseCountIds1,UseCountIds2,UseCountIds3&#xa;", 
    string-join(/entries/*, ',') 
) 

Более общее решение, которое работает с любыми детьми тегами может быть

declare function f:label($element as element()) as xs:string { 
    if (count($element/../*[node-name(.)=node-name($element)]) gt 1) 
    then concat(local-name($element), count($element/preceding-sibling::*[node-name(.)=node-name($element)])) 
    else local-name($element) 
}; 

concat(string-join(/entries/*/f:label(.), ','), '&#xa;', 
string-join(/entries/*, ',') 
Смежные вопросы