Xquery 处理错误 (saxon) XPST0003: '>' 的左操作数需要括号

Xquery processing error (saxon) XPST0003: Left operand of '>' needs parentheses

我想使用 XQuery(使用 Saxon XQuery 处理器)从 XML 数据生成一个 HTML 文件。

我正在尝试创建一个 "intervenants"(教师)列表,其中包含 "unites"(类)每个教师的列表。

这是我的 XQuery 代码:

declare boundary-space preserve;
declare option saxon:output "method=xml";
declare option saxon:output "encoding=iso-8859-1";
declare option saxon:output "doctype-public=-//W3C//DTD XHTML 1.0 Strict//EN";
declare option saxon:output "doctype-system=-http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd";


declare function local:main() {
    let $doc := doc("tp4.xml")/master

    for $intervenant in $doc/intervenants/intervenant
    order by $intervenant/nom
    return local:displayIntervenant($intervenant)
};

declare function local:displayIntervenant($intervenant) {

    <li>{data($intervenant/nom)} {data($intervenant/prénom)}</li>
    <li>Unites: </li>
        <ul>:here will be the function for getting "unites":</ul>

};

<html>
<body>
<h1>Intervenants</h1>
    <ul>
        {local:main()}
    </ul>
</body>
</html>

我有以下错误:

$java -cp Saxon/saxon9he.jar net.sf.saxon.Query !indent=yes xq.txt > www/xq.html
Syntax error on line 19 at column 6 of file:/home/luc/Documents/XML/TP4/xq.txt near {...ant/prénom)}</li> <li>Unite...} 
  XPST0003: Left operand of '>' needs parentheses

第 19 行引用第二个 <li> 元素。

我不明白错误信息,无法修复。

您想 return 一个函数中的多个元素。在 XQuery 中,函数应该包含单个顶级语句,但多个元素是多个语句。按顺序包装它们:

declare function local:displayIntervenant($intervenant) {
  (   
    <li>{data($intervenant/nom)} {data($intervenant/prénom)}</li>,
    <li>Unites: </li>,
        <ul>:here will be the function for getting "unites":</ul>
  )
};

在这种情况下,您也可以省略括号,但必须保留逗号:

declare function local:displayIntervenant($intervenant) {
    <li>{data($intervenant/nom)} {data($intervenant/prénom)}</li>,
    <li>Unites: </li>,
        <ul>:here will be the function for getting "unites":</ul>
};

如果您将 <ul/> 元素放入函数中(您目前在函数下方的 HTML 中),您也将实现相同的目标,即拥有一个顶部函数中的级语句:

declare function local:displayIntervenant($intervenant) {
  <ul>
    <li>{data($intervenant/nom)} {data($intervenant/prénom)}</li>
    <li>Unites: </li>
        <ul>:here will be the function for getting "unites":</ul>
  </ul>
};

回答你问题的另一部分,要求对错误信息的解释。

在 XQuery 中生成良好的错误消息很困难,因为语法非常复杂,有时解析器认为您正在尝试做一些与您认为正在尝试做的完全不同的事情。这里发生的是 Saxon 解析了表达式:

<li>{data($intervenant/nom)} {data($intervenant/prénom)}</li>

然后它看到的下一个东西是“<”,在这种情况下(在表达式之后)只能是一个小于运算符,所以它采用了这种解释。然后它尝试在 "<" 运算符的 RHS 上找到表达式,并找到 "li"(这是一个有效的表达式,意思是 child::li)。所以它读取了 (A < li) 形式的表达式,接下来它看到的是“>”。唯一可以是 "greater-than" 运算符。但是这里不允许使用大于运算符,因为运算符的优先级是错误的:(A < li > B) 不是有效的表达式。解析器错误地猜测您的意思是 (A < li) > B 并用这些术语表达错误消息。

这可能是一个相当常见的错误,我会看看是否可以对诊断进行一些特殊处理。

以后

我已经调整了解析器,因此错误消息现在将是:

XPST0003:“>”的左操作数需要括号。或者 XQuery 元素构造函数出现在不允许的地方