我使用zorba作为XQuery处理器。我试图弄清楚如何使用XQuery返回多个元素。然后我找到了this。
xml doc:
<data>
<person>
<name>Me</name>
<last>Proj</last>
<mrn>54</mrn>
<phone>43434</phone>
<fax>34343</fax>
</person>
<person>
<name>Me2</name>
<last>Proj</last>
<mrn>542</mrn>
<phone>434342</phone>
<fax>343432</fax>
</person>
</data>
xqy doc:
let $last :="Proj"
return
<html>
<head><title>Example</title></head>
<body>
<table frame="box">
<tr>
<td>Name</td>
<td>Last</td>
<td>MRN</td>
</tr>
{
for $person in ( doc("test.xml")/data/person\[last=$last\] )
return
<tr>
<td>{$person/name/string()}</td>
<td>{$person/last/string()}</td>
<td>{$person/mrn/string()}</td>
</tr>
}
</table>
</body>
</html>
命令行:
$ zorba -i -f -q test.xqy
test.xqy>:13,45: static error [err:XPST0003]: invalid expression: syntax error: unexpected character "\"; raised at /tmp/zorba20151126-72875-uij83f/zorba-3.0/src/compiler/api/compiler_api.cpp:252
我是XQuery的新手。有人可以指出如何使这项工作?
答案 0 :(得分:1)
Zorba在你的for
条款中抱怨这个表达式:
doc("test.xml")/data/person\[last=$last\]
反斜杠无效XQuery或XPath;删除它们会给你一个有效的表达:
doc("test.xml")/data/person[last=$last]
更新:这是表达式的细分:
doc("test.xml")
是一个函数调用:它以给定的URI(http://www.xqueryfunctions.com/xq/fn_doc.html)/data
是一个XPath步骤;它选择 context 节点的直接子节点的所有<data/>
元素(在本例中为文档)/person
是另一个XPath步骤;它选择 context 节点的直接子节点的所有<person/>
元素(在这种情况下,每个先前选择的<data/>
元素)[last=$last]
是一个XPath谓词;它通过测试节点是否与谓词匹配来过滤上下文节点(在这种情况下,每个先前选择的<person/>
元素)进一步解构XPath步骤/data
和/person
:
/
是child::
轴的简写; /data
的扩展形式为/child::data
//
,可扩展为descendant-or-self::
进一步解构谓词[last=$last]
:
last
选择上下文节点的直接子节点的<last/>
元素(在本例中为先前选择的<person/>
元素)=
是集等价运算符;如果左手序列中的任何原子出现在右手序列中,则评估为true
$last
是XQuery表达式开头的变量(let $last := "Proj"
)总之,对于包含字符串值等于[last=$last]
的{{1}}元素的任何true
元素,谓词<person/>
将评估为<last/>
。