Xquery 嵌套 map:merge 来自 xml 产生错误 "expected single value for key, got 0"
Xquery nested map:merge from xml produces error "expected single value for key, got 0"
在 Xquery 3.1 中,我试图将 XML 文档转换为嵌套映射。我的 xml 文档 $keyworddoc
具有以下结构:
<category xml:id="KW0003">
<desc xml:lang="fr">évêque</desc>
<desc xml:lang="en">bishop</desc>
<desc xml:lang="de">Bischof</desc>
<desc xml:lang="es">obispo</desc>
<desc xml:lang="it">vescovo</desc>
</category>
<category xml:id="KW0004">
<desc xml:lang="fr">sacrement</desc>
<desc xml:lang="en">sacrament</desc>
<desc xml:lang="de">Sakrament</desc>
<desc xml:lang="es">sacramento</desc>
<desc xml:lang="it">sacramento</desc>
</category>
<category xml:id="KW0005">
<desc xml:lang="fr">messe</desc>
<desc xml:lang="en">mass</desc>
<desc xml:lang="de">Messe</desc>
<desc xml:lang="es">misa</desc>
<desc xml:lang="it">messa</desc>
</category>
具有所需的地图输出:
map {
"KW0003": map {
"fr": "évêque",
"en": "bishop",
"de": "Bischof",
"es": "obispo",
"it": "vescovo"},
"KW0004": map {
"fr": "sacrement",
"en": "sacrament",
"de": "Sakrament",
"es": "sacramento",
"it": "sacramento"},
"KW0005": map {
"fr": "messe",
"en": "mass",
"de": "Messe",
"es": "misa",
"it": "messa"},
}
然而,我的函数:
let $kwdoc := $keyworddoc//tei:category
return map:merge(for $kw in $kwdoc
return map{$kw/data(@xml:id) :
map:merge(for $desc in $kw
return map{$desc/data(@xml:lang) :
$desc/text()}
)})
产生以下错误,表明嵌套的 for 循环没有“看到”变量 $kw
?:
Expected single value for key, got 0
也许我正在以错误的方式构建我的第一个嵌套地图。
编辑:eXist 5x 中的 Xquery。
非常感谢。
由于 $kw
一次绑定到单个 tei:category
元素,子句 for $desc in $kw
遍历 single-element 序列并仅将同一元素绑定到 $desc
,因此在这种情况下相当于 let $desc := $kw
。
您想要的是迭代 $kw
的 tei:desc
个子代:
let $kwdoc := $keyworddoc//tei:category
return map:merge(
for $kw in $kwdoc
return map{
$kw/data(@xml:id): map:merge(
for $desc in $kw/tei:desc
return map{ $desc/data(@xml:lang): $desc/text() }
)
}
)
在 Xquery 3.1 中,我试图将 XML 文档转换为嵌套映射。我的 xml 文档 $keyworddoc
具有以下结构:
<category xml:id="KW0003">
<desc xml:lang="fr">évêque</desc>
<desc xml:lang="en">bishop</desc>
<desc xml:lang="de">Bischof</desc>
<desc xml:lang="es">obispo</desc>
<desc xml:lang="it">vescovo</desc>
</category>
<category xml:id="KW0004">
<desc xml:lang="fr">sacrement</desc>
<desc xml:lang="en">sacrament</desc>
<desc xml:lang="de">Sakrament</desc>
<desc xml:lang="es">sacramento</desc>
<desc xml:lang="it">sacramento</desc>
</category>
<category xml:id="KW0005">
<desc xml:lang="fr">messe</desc>
<desc xml:lang="en">mass</desc>
<desc xml:lang="de">Messe</desc>
<desc xml:lang="es">misa</desc>
<desc xml:lang="it">messa</desc>
</category>
具有所需的地图输出:
map {
"KW0003": map {
"fr": "évêque",
"en": "bishop",
"de": "Bischof",
"es": "obispo",
"it": "vescovo"},
"KW0004": map {
"fr": "sacrement",
"en": "sacrament",
"de": "Sakrament",
"es": "sacramento",
"it": "sacramento"},
"KW0005": map {
"fr": "messe",
"en": "mass",
"de": "Messe",
"es": "misa",
"it": "messa"},
}
然而,我的函数:
let $kwdoc := $keyworddoc//tei:category
return map:merge(for $kw in $kwdoc
return map{$kw/data(@xml:id) :
map:merge(for $desc in $kw
return map{$desc/data(@xml:lang) :
$desc/text()}
)})
产生以下错误,表明嵌套的 for 循环没有“看到”变量 $kw
?:
Expected single value for key, got 0
也许我正在以错误的方式构建我的第一个嵌套地图。
编辑:eXist 5x 中的 Xquery。
非常感谢。
由于 $kw
一次绑定到单个 tei:category
元素,子句 for $desc in $kw
遍历 single-element 序列并仅将同一元素绑定到 $desc
,因此在这种情况下相当于 let $desc := $kw
。
您想要的是迭代 $kw
的 tei:desc
个子代:
let $kwdoc := $keyworddoc//tei:category
return map:merge(
for $kw in $kwdoc
return map{
$kw/data(@xml:id): map:merge(
for $desc in $kw/tei:desc
return map{ $desc/data(@xml:lang): $desc/text() }
)
}
)