Как подключить один FLWOR к другому?

Простой FLWOR для получения всех данных (из того, что было электронной таблицей):

for $foo  in db:open("foo")
return $foo//text()

дает этот тип вывода:

...    
Smallville, XX 12345-1234
Bob 
(123) 456-7809
(123) 876-3468
Smallville, XX 12345-1234
Alice
Smallville, XX 12345-1234
Fred
(123) 654-5432
Smallville, XX 12345-1234
...

и другой, который возвращает нечисловые данные:

for $foo  in db:open("foo")
return $foo//text()[not(matches(., '[0-9]'))]

Который кажется возвращает только имена. Исходя из этого предположения, мы пытаемся вызвать закрывающие теги в <person> и открыть новый <person>, например:

<person>
<name>a</name>
<data>123</data>
<data>345</data>
<data>123 main st</data>
</person>

<person>
...
</person>

Или что-то вроде того. Только на самом деле пытаясь разделить людей, предполагая, что в их именах нет цифр, а затем создавая некую сущность в XML.

Просто до тех пор, пока каждый раз, когда находится «имя», оно вызывает закрытие тегов, а затем «запуск» нового человека. Совсем не уверен в стандартном жаргоне здесь.


person Thufir    schedule 14.02.2020    source источник


Ответы (1)


Далее создается временная структура XML, затем выполняется итерация по каждому из элементов name, создавая person с элементами name и following-sibling::data.

let $temp := 
  <doc>{
    for $foo in db:open("foo")
    return
      if (matches($foo, "[0-9]")) 
      then <data>{$foo}</data>
      else <name>{$foo}</name>
  }</doc>

for $name in $temp/name
return
  <person>{
    $name,
    $name/following-sibling::data[preceding-sibling::name[1]= $name]
  }</person>
person Mads Hansen    schedule 14.02.2020