【问题标题】:Xquery processing error (saxon) XPST0003: Left operand of '>' needs parenthesesXquery 处理错误 (saxon) XPST0003: '>' 的左操作数需要括号
【发布时间】:2016-06-15 16:13:37
【问题描述】:

我想使用 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 行引用第二个 &lt;li&gt; 元素。

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

【问题讨论】:

  • 不是这里的问题,但我认为 HTML 不允许 &lt;ul/&gt; 元素作为 &lt;ul/&gt; 元素的直接子元素。
  • 你是对的!根据 html 的官方 dtd,&lt;ul/&gt; 不能是 &lt;ul/&gt; 元素的直接子元素。然而,大多数网络浏览器都能正确解释它们。再次感谢您

标签: xml xquery saxon


【解决方案1】:

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

如果您将&lt;ul/&gt; 元素放在函数内(您目前在函数下方的 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>
};

【讨论】:

  • 非常感谢!你拯救了我的一天!
【解决方案2】:

回答您问题的另一部分,要求对错误消息进行解释。

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

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

然后它看到的下一个东西是“"<" 运算符的 RHS 上查找表达式,并找到“li”(这是一个有效的表达式,意思是 child::li)。因此,它读取了(A &lt; li) 形式的表达式,然后它看到的是“>”。唯一可以是“大于”运算符。但是这里不允许使用大于运算符,因为运算符优先级错误:(A &lt; li &gt; B) 不是有效的表达式。解析器错误地猜测您的意思是 (A &lt; li) &gt; B 并用这些术语表达错误消息。

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

稍后

我已经调整了解析器,所以现在的错误消息是:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-12-20
    • 2011-03-04
    • 2017-01-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多