XQuery — для вставки данных разделенных узлов в другой узел

<?xml version="1.0" encoding="UTF-8"?>
<Data>
  <A><DelInfo>123-20150308-345</DelInfo><OrderNo>11</OrderNo></A>
  <A><DelInfo>1204-20150308-355</DelInfo><OrderNo>15</OrderNo></A>
  <A><DelInfo>153-20150408-343</DelInfo><OrderNo>10</OrderNo></A>
  <A><DelInfo>44345-20150308-341</DelInfo><OrderNo>21</OrderNo></A>
  <A><DelInfo>153-20150204-245</DelInfo><OrderNo>1</OrderNo></A>
  <A><DelInfo>423-20150311-445</DelInfo><OrderNo>13</OrderNo></A>
  ..........
</Data>

Я получаю следующий XML. Узел DelInfo содержит комбинацию EmpId, даты доставки и номера квитанции. Узел OrderNo содержит номер заказа с информацией о доставке.

XML хранится в BaseX, и мне нужно создать следующий отчет из приведенного выше XML.

<A><DelInfo>123-20150308-345</DelInfo><OrderNo>11</OrderNo><Report>20150308 - 11</Report></A>
.....

Другими словами, я хочу вставить дополнительный узел Report с датой и номером заказа. Есть идеи?


person Community    schedule 08.08.2015    source источник
comment
что вы пробовали до сих пор?   -  person John    schedule 08.08.2015
comment
Я немного смущен тем, как получить часть даты!!   -  person    schedule 08.08.2015
comment
Вам нужно использовать функции substring-after() и substring-before() для извлечения части Date.   -  person John    schedule 08.08.2015


Ответы (1)


Замените yourdoc названием вашего документа.

for $x in doc('yourdoc')//A
  let $d := substring-before(substring-after($x/DelInfo, "-"), "-")
  let $o := $x/OrderNo/text()
  let $i := <C>{concat($d, " - ", $o)}</C>
return 
    insert node $i after $x/OrderNo

Внутренний substring-after() вернет строку после первого -. Затем substring-before() вернет строку перед -. Таким образом, вы получите часть даты.

person John    schedule 08.08.2015