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

时间:2016-03-02 16:56:16

标签: xml xquery saxon

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

我正在尝试创建一个“干预者”(教师)列表,其中包含每个人教授的“单元”(类)列表。

这是我的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>元素。

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

2 个答案:

答案 0 :(得分:3)

您想要在函数中返回多个元素。在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>
};

答案 1 :(得分:1)

回答问题的其他部分,要求解释错误信息。

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

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

然后它看到的下一件事是&#34;&lt;&#34 ;,在这个上下文中(在表达式之后)只能是一个小于运算符,因此它需要这种解释。然后它尝试在"<"运算符的RHS上找到表达式,并找到&#34; li&#34; (这是一个有效的表达式,意思是child :: li)。所以它读了一个(A < li)形式的表达式,它看到的下一个东西是&#34;&gt;&#34;。唯一可能的是&#34;大于&#34;运营商。但是这里不允许使用大于运算符,因为运算符优先级错误:(A < li > B)不是有效表达式。解析器错误地猜测你的意思是(A < li) > B并用这些术语表达错误信息。

这可能是一个相当常见的错误,我会看看我是否可以在诊断上做一些特殊的外壳。

<强>后来

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

XPST0003:&#39;&gt;&#39;的左操作数需要括号。或者也许XQuery元素构造函数出现在不允许的地方