XQuery文件使用特殊字符返回无效的实体引用

时间:2017-04-07 16:40:10

标签: xquery marklogic entityreference

我在MarkLogic XQuery文件中有以下查询,我看到返回以下错误消息

XDMP-ENTITYREF: (err:XPST0003) Invalid entity reference " " . See the MarkLogic server error log for further detail.

以下是我在XQuery文件中使用的代码。

xquery version "1.0-ml";

declare variable $query := 

  cts:or-query
  ((
    cts:element-word-query(xs:QName("lines"),"l&l"),
    cts:element-word-query(xs:QName("lines"),"pool & cue"),
    cts:element-word-query(xs:QName("lines"),"look")
  ));

declare function local:do-query(){
  element xml {
    for $i in cts:uris( (), (), $query)
    let $item := doc($i)

    return
      element item {
        element title { $item/title/string() }
    }
  }
};

local:do-query()

显然我要找的2x标签是l&lpool & cue。我还在另一个问题中查看了修复完整的建议,但无法弄清楚这是如何适合这个查询的。如果我删除了带有特殊字符的字符,它会按预期工作。

有什么想法吗?

1 个答案:

答案 0 :(得分:1)

根据问题评论中的附加信息,这不是代码执行的问题,而是代码的部署。

如果您使用QConsole插入代码,或者您评估XQuery代码的其他方式,则会经常发生这种情况。 &被解释,并转换为它所代表的&字符。如果然后将其写入.xqy文件到某些模块数据库中,它就不会再次转发回&,因为XQuery文件在MarkLogic中以纯文本形式存储,而&没有。用纯文本进行转义。

部署代码的更好方法是从磁盘上载或插入。这样,XML中的&>{等字符就不会被解释,但会保留并按原样插入。有ml-gradleRoxy等工具可以非常轻松地部署MarkLogic代码。考虑使用这些。或者,您也可以考虑对Management REST api使用Curl。

如果你想要使用QConsole,请转发&之类的字符两次。例如。 &变为&amp;amp;<变为&amp;lt;

HTH!