【问题标题】:Xquery - Using sparql results to dynamically create XML. Dynamic Element NamesXquery - 使用 sparql 结果动态创建 XML。动态元素名称
【发布时间】:2018-02-20 16:40:10
【问题描述】:

我正在使用 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 $results 中的 $item -- 无法使用 sem:iri("http://www.w3.org/2008/05/skos-xl#altLabel") 作为元素 名字

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

[1.0-ml] XDMP-QNAMELEXFORM:对于 $results 中的 $item -- 词法无效 QName 表单

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

感谢您的阅读。

【问题讨论】:

    标签: xquery marklogic


    【解决方案1】:

    转换为字符串就足够了。

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

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

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

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

    【讨论】:

    • 我找到了,这很有帮助。显然有一个关系作为空白字符串返回,看来我的关系不符合它也应该符合的假设。感谢您的指导。这能够帮助我发现数据的个别问题,而不是您建议的方法....我从 # 中分离出来,假设它始终是关系前值,但是,有一个关系没有找到 # 个
    • 太棒了!很高兴它有帮助。
    猜你喜欢
    • 2020-12-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-09-06
    • 1970-01-01
    相关资源
    最近更新 更多