Среда: eXist-DB 4.4 / Xquery 3.1
У меня есть сотни документов tei: xml, в которых закодированы именованные объекты persName
и placeName
. Документы в
collection("db/fooapp/data")
Каждый экземпляр persName
и placeName
имеет атрибут @nymRef
, который содержит одно значение, которое ссылается на xml:id
в основных документах:
db/fooapp/data/codes_persons.xml
db/fooapp/data/codes_places.xml
Эти основные документы содержат, среди прочего, каноническое имя каждого человека или места.
Я часто делаю одиночные поиски для определенного имени, например
let $x := some @nymRef
let $y := doc(db/fooapp/data/codes_places.xml)//tei:place[@xml:id=$x]//tei:placeName/text()
return $y
Но бывают случаи, когда мне нужно это делать, перебирая огромные списки. Например, для всех документов мне нужно вывести id
для seg
, и у него есть (или несколько) дочерний элемент placeName/@nymRef
:
<seg xml:id="fooref">some text<placeName nymRef="fooplace"/>some text</seg>
Задача состоит в том, чтобы получить все seg/@xml:id
, а затем найти и вывести каноническое имя любого placeName/@nymRef
под ним. Это приводит к многочисленным поездкам в оба конца, которые действительно неэффективны, но я не знаю других способов сделать это в eXist-DB. Дорогая поездка туда и обратно выражена в let $c
, циклически через return
:
let $coll := collection("db/fooapp/data")
for $a in $coll//seg
for $b in $a//placeName
let $c := $doc("db/fooapp/data/codes_places.xml")//tei:place[@xml:id=$b/data(@nymRef)]//tei:placeName/text()
return
<tr>
<td>{$a/@xml:id}</td>
<td>{$c}</td>
</tr>
Это может добавить до сотен циклов для одного вывода таблицы.
У меня нет возражений против реструктуризации задачи в несколько функций, если это необходимо.
Большое спасибо заранее.