Xquery - 使用 sparql 结果动态创建 XML。动态元素名称

Xquery - Using sparql results to dynamically create XML. Dynamic Element Names

我正在使用 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: (err:XPTY0004) for $item in $results -- Cannot use sem:iri("http://www.w3.org/2008/05/skos-xl#altLabel") as an element name

我尝试将有问题的项目转换为使用 fn:string 的字符串,但这会导致

[1.0-ml] XDMP-QNAMELEXFORM: for $item in $results -- Invalid lexical form for QName

如何在 XML 构建期间在 XQuery 中声明动态元素名称? 首先是什么导致了这个错误?我一直在搞乱语法来尝试弄清楚,我不知道是什么导致了这个问题?

感谢您的阅读。

转换为字符串应该足够了。

但是,您的示例中有前斜线,我认为这是无效的。

其次,您的示例将创建一个定义为 html 命名空间中的元素 - 或者您将前缀 html 定义为的任何内容。

此外,冒号后的第一个字符不是必需的字母数字字符。

在我看来,问题在于您尝试用于元素名称的名称 - 而不是实际方法。