我想使用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>
元素。
我不明白错误信息,我无法修复它。
答案 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元素构造函数出现在不允许的地方