return 多个元素具有 XQuery:invalid 表达式
return more than one elements with XQuery:invalid expression
我使用 zorba 作为 XQuery 处理器。我正在尝试弄清楚如何使用 XQuery return 多个元素。然后我找到了this。
xml 文档:
<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 文档:
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 还很陌生。有人可以指出如何进行这项工作吗?
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 步骤;它选择所有 <person/>
元素,这些元素是 context 节点的直接子元素(在这种情况下,每个先前选择的 <data/>
元素)
[last=$last]
是一个 XPath 谓词;它通过测试节点是否匹配谓词 来过滤 context 节点(在这种情况下,每个先前选择的 <person/>
元素)
进一步解构XPath步骤/data
和/person
:
/
是 shorthand 对于 child::
轴; /data
的扩展形式是 /child::data
- 还有许多其他 XPath 轴。常用的轴是
//
,扩展为 descendant-or-self::
- 下面是关于 XPath 轴的更多详细信息:https://our.umbraco.org/wiki/reference/xslt/xpath-axes-and-their-shortcuts/
进一步解构谓词[last=$last]
:
- 括号表示谓词的开始和结束
last
选择 <last/>
元素,它们是 context 节点的直接子元素(在本例中,先前选择的 <person/>
元素)
=
是集合等价运算符;如果左侧序列中的任何原子出现在右侧序列 中,它的计算结果为 true
$last
是绑定在 XQuery 表达式开头的变量 (let $last := "Proj"
)
总而言之,对于任何包含 <last/>
元素且字符串值等于 [=41= 的 <person/>
元素,谓词 [last=$last]
的计算结果为 true
].
我使用 zorba 作为 XQuery 处理器。我正在尝试弄清楚如何使用 XQuery return 多个元素。然后我找到了this。
xml 文档:
<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 文档:
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 还很陌生。有人可以指出如何进行这项工作吗?
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 节点(在本例中为文档) 的直接子节点的所有 /person
是另一个 XPath 步骤;它选择所有<person/>
元素,这些元素是 context 节点的直接子元素(在这种情况下,每个先前选择的<data/>
元素)[last=$last]
是一个 XPath 谓词;它通过测试节点是否匹配谓词 来过滤 context 节点(在这种情况下,每个先前选择的
<data/>
元素
<person/>
元素)
进一步解构XPath步骤/data
和/person
:
/
是 shorthand 对于child::
轴;/data
的扩展形式是/child::data
- 还有许多其他 XPath 轴。常用的轴是
//
,扩展为descendant-or-self::
- 下面是关于 XPath 轴的更多详细信息:https://our.umbraco.org/wiki/reference/xslt/xpath-axes-and-their-shortcuts/
进一步解构谓词[last=$last]
:
- 括号表示谓词的开始和结束
last
选择<last/>
元素,它们是 context 节点的直接子元素(在本例中,先前选择的<person/>
元素)=
是集合等价运算符;如果左侧序列中的任何原子出现在右侧序列 中,它的计算结果为 $last
是绑定在 XQuery 表达式开头的变量 (let $last := "Proj"
)
true
总而言之,对于任何包含 <last/>
元素且字符串值等于 [=41= 的 <person/>
元素,谓词 [last=$last]
的计算结果为 true
].