运行 xquery 对数据库的 xpath?
run xpath from xquery against a database?
如何使用 basex
GUI 从 xquery
脚本中 运行 查询 xpath
?
成功xpath
查询数据库:
xquery
尝试失败:
此数据库最简单的 xquery
代码:
thufir@dur:~/basex$
thufir@dur:~/basex$ cat db_list_items.xq
let $db := db:open("list")
return root()/descendant::li/a/text()
thufir@dur:~/basex$
不太确定如何 return 以上结果。
来自 basex
GUI 的错误日志:
Error:
Stopped at /home/thufir/basex/db_list_items.xq, 4/12:
[XPDY0002] root(): no context value bound.
Compiling:
- pre-evaluate db:open(database[,path]) to document-node(): db:open("list") -> db:open-pre("list", 0)
- inline $db_0
- simplify gflwor
Optimized Query:
root()/descendant::li/a/text()
Query:
let $db := db:open("list") return root()/descendant::li/a/text()
Query plan:
<QueryPlan compiled="true" updating="false">
<CachedPath type="text()*">
<FnRoot name="root([node])" type="node()?"/>
<IterStep axis="descendant" test="li" type="element()*"/>
<IterStep axis="child" test="a" type="element()*"/>
<IterStep axis="child" test="text()" type="text()*"/>
</CachedPath>
</QueryPlan>
使用 basex
.
寻找此数据库的简单查询
就像导航文件系统(或任何其他基于树的结构)一样,我们需要知道我们在该结构中的位置,以便能够使用路径表达式:
/home/logname/documents/work #> cd todo
/home/logname/documents/work/todo #>
命令行解释器怎么知道,在哪里可以找到 todo 目录?它知道这一点,因为按照惯例,它假定 cd
命令的上下文是 当前目录 ,在本例中是 /home/logname/documents/work
。
当您将 document/database 加载到 BaseX 中时,它会对 XPath 表达式和 XQuery 执行相同的操作,只要上下文清晰即可。例如,如果您在查询编辑器中放置一个点 .
,然后执行该查询,它将返回整个文档,因为这就是 .
所代表的:当前上下文项。在这里,BaseX 从约定中知道这个上下文,默认情况下,它对当前加载的文档执行查询,就像命令行解释器将当前目录假定为当前上下文一样。可以说,通过加载 document/database,您 cd
进入了该文档的根目录。到目前为止一切顺利...
一旦您使用 XQuery,您就在使用一种完整的编程语言,它允许的不仅仅是查询单个文档。您可以在一个脚本中查询一大堆文档。
拿这个(不完整的)代码片段:
let $db := db:open("list")
let $db2 := db:open("list2")
如果您现在按照以前的方式进行查询,它们会去哪里?他们使用 $db
作为上下文还是 $db2
?
您需要做的是将这件事告诉处理者。这可以通过多种方式完成:
- 在脚本的 prolog 中:
declare context item := db:open("list");
(另请参阅:BaseX documentation on this and, very important, read about the difference between "static context" and "dynamic context" here)以了解有关上下文的更多信息。
- 在 XPath 表达式本身中:
let $db := db:open("list")
return $db/root()/descendant::li/a/text()
或者,简化:
let $db := db:open("list")
return $db//li/a/text()
或:
declare context item := db:open("list");
.//li/a/text()
如何使用 basex
GUI 从 xquery
脚本中 运行 查询 xpath
?
成功xpath
查询数据库:
xquery
尝试失败:
此数据库最简单的 xquery
代码:
thufir@dur:~/basex$
thufir@dur:~/basex$ cat db_list_items.xq
let $db := db:open("list")
return root()/descendant::li/a/text()
thufir@dur:~/basex$
不太确定如何 return 以上结果。
来自 basex
GUI 的错误日志:
Error:
Stopped at /home/thufir/basex/db_list_items.xq, 4/12:
[XPDY0002] root(): no context value bound.
Compiling:
- pre-evaluate db:open(database[,path]) to document-node(): db:open("list") -> db:open-pre("list", 0)
- inline $db_0
- simplify gflwor
Optimized Query:
root()/descendant::li/a/text()
Query:
let $db := db:open("list") return root()/descendant::li/a/text()
Query plan:
<QueryPlan compiled="true" updating="false">
<CachedPath type="text()*">
<FnRoot name="root([node])" type="node()?"/>
<IterStep axis="descendant" test="li" type="element()*"/>
<IterStep axis="child" test="a" type="element()*"/>
<IterStep axis="child" test="text()" type="text()*"/>
</CachedPath>
</QueryPlan>
使用 basex
.
就像导航文件系统(或任何其他基于树的结构)一样,我们需要知道我们在该结构中的位置,以便能够使用路径表达式:
/home/logname/documents/work #> cd todo
/home/logname/documents/work/todo #>
命令行解释器怎么知道,在哪里可以找到 todo 目录?它知道这一点,因为按照惯例,它假定 cd
命令的上下文是 当前目录 ,在本例中是 /home/logname/documents/work
。
当您将 document/database 加载到 BaseX 中时,它会对 XPath 表达式和 XQuery 执行相同的操作,只要上下文清晰即可。例如,如果您在查询编辑器中放置一个点 .
,然后执行该查询,它将返回整个文档,因为这就是 .
所代表的:当前上下文项。在这里,BaseX 从约定中知道这个上下文,默认情况下,它对当前加载的文档执行查询,就像命令行解释器将当前目录假定为当前上下文一样。可以说,通过加载 document/database,您 cd
进入了该文档的根目录。到目前为止一切顺利...
一旦您使用 XQuery,您就在使用一种完整的编程语言,它允许的不仅仅是查询单个文档。您可以在一个脚本中查询一大堆文档。
拿这个(不完整的)代码片段:
let $db := db:open("list")
let $db2 := db:open("list2")
如果您现在按照以前的方式进行查询,它们会去哪里?他们使用 $db
作为上下文还是 $db2
?
您需要做的是将这件事告诉处理者。这可以通过多种方式完成:
- 在脚本的 prolog 中:
declare context item := db:open("list");
(另请参阅:BaseX documentation on this and, very important, read about the difference between "static context" and "dynamic context" here)以了解有关上下文的更多信息。 - 在 XPath 表达式本身中:
let $db := db:open("list")
return $db/root()/descendant::li/a/text()
或者,简化:
let $db := db:open("list")
return $db//li/a/text()
或:
declare context item := db:open("list");
.//li/a/text()