我正在使用MarkLogic 8。
我有一个SPARQL语句。
let $results :=
sem:sparql(
"
PREFIX skosxl: <http://www.w3.org/2008/05/skos-xl#>
PREFIX rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#>
PREFIX owl: <http://www.w3.org/2002/07/owl#>
PREFIX skos: <http://www.w3.org/2004/02/skos/core#>
PREFIX rdfs: <http://www.w3.org/2000/01/rdf-schema#>
PREFIX slc: <http://www.smartlogic.com/2014/08/semaphore-core#>
select ?relation ?value
where
{
$input ?relation ?c .
OPTIONAL {
?c skosxl:prefLabel/skosxl:literalForm|skosxl:literalForm ?d .
}
BIND ( if (bound(?d), ?d, ?c) as ?value )
}
", $bindings
)
这为我提供了(relation, value)
对列表的结果。
我正在尝试将此响应转换为静态存储的XML文档。
我尝试了各种不同的方法。
尝试1
let $doc := <test>{
for $item in $results
return element {map:get($item, 'relation')} {map:get($item, 'value')}
}</test>
return $doc
错误:
XDMP-ELEMNAME :(错误:XPTY0004)for $ item in $ results - 无法使用 sem:iri(“http://www.w3.org/2008/05/skos-xl#altLabel”)作为元素 名称
我尝试使用fn:string
将相关项目转换为字符串,但这会导致
[1.0-ml] XDMP-QNAMELEXFORM:for $ item in $ results - 无效的词汇 QName的表单
如何在XML Building期间在XQuery中声明动态元素名称? 是什么原因造成了这个错误?我一直在搞乱语法试图找出来,我不知道是什么导致了这个问题?
感谢您的阅读。
答案 0 :(得分:3)
以字符串形式施放就足够了。
但是,您的示例有前导斜杠,我认为这是无效的。
其次,你的例子是将一个元素定义为在html命名空间中 - 或者你定义的前缀html是什么。
此外,冒号后的第一个字符不是必需的字母数字字符。
在我看来,您尝试用于元素名称的名称是问题 - 而不是实际方法。