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

时间:2018-02-20 16:40:10

标签: xquery marklogic

我正在使用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中声明动态元素名称? 是什么原因造成了这个错误?我一直在搞乱语法试图找出来,我不知道是什么导致了这个问题?

感谢您的阅读。

1 个答案:

答案 0 :(得分:3)

以字符串形式施放就足够了。

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

其次,你的例子是将一个元素定义为在html命名空间中 - 或者你定义的前缀html是什么。

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

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