我在XML中具有以下元素:
<series id="iot" type="main">Institute of Theology</series>
我想做的是以最注重性能的方式获取数据库中的所有序列值以及匹配的@id
值。我已经在<series/>
上设置了元素范围索引,也在@id
上设置了属性范围索引。我尝试使用cts:element-values()
来获得系列元素值非常有用,但是我不知道如何返回元素和匹配的id值。
我要寻找的最终结果应该是这样的:
iot Institute of Theology
答案 0 :(得分:5)
您可以使用cts:value-tuples
获取索引值的元组。
例如,这将返回series/@id
和series
对:
cts:value-tuples((
cts:element-attribute-reference(xs:QName('series'), xs:QName('id')),
cts:element-reference(xs:QName('series'))
))
但是,如果每个文档中只有<series>
个,则这些对将仅在<series>
之内是准确的。否则,您将获得每个文档的series/@id
和series
的所有组合,无论它们是否来自同一元素。
如果是这种情况,那么您的选择是更改文档(或使用片段根,可能不是一个好主意),或使用其他方法,例如Template Driven Extraction ,其中可以将这些对投影到一个“行列”索引(如行)中,然后与文档上下文分开查询。
答案 1 :(得分:3)
通过对wst的答案进行一些小的更改,我就能解决此问题。我正在使用的XML确实确实在每个文档中有多个<series>
元素,但是通过在cts:value-tuples()
中使用“ proximity = N”选项,我找到了一种解决方法。将接近度设置为0会返回@id
和最接近的系列标题。
代码如下:
for $tuple in
cts:value-tuples((
cts:element-attribute-reference(xs:QName("ia:series"), xs:QName('id')),
cts:element-reference(xs:QName("ia:series"))
), "proximity=0")
let $values := json:transform-from-json($tuple)
return
for $value in $values
let $id := $value/jsonNS:item[1]
let $title := $value/jsonNS:item[2]
return fn:concat($id, " | ", $title)