从xquery对数据库运行xpath?

问题描述 投票:0回答:1

如何使用xpath GUI在xquery脚本中运行basex查询?

成功的xpath查询数据库:xpath

失败的xquery尝试: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$ 

不太确定如何返回上面的结果。

来自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寻找这个数据库的简单查询。

xml xpath xml-parsing xquery basex
1个回答
1
投票

就像导航文件系统(或任何其他基于树的结构)一样,我们需要知道我们在该结构中的位置,以便能够使用路径表达式:

/home/logname/documents/work #> cd todo
/home/logname/documents/work/todo #>

命令行解释器是如何知道的,在哪里可以找到todo目录?它知道这一点,因为按照惯例,它假定cd命令的上下文是当前目录,在这种情况下是/home/logname/documents/work

将文档/数据库加载到BaseX时,只要上下文清晰,它就会对XPath表达式和XQuerys执行相同的操作。例如,如果您在查询编辑器中放置一个点.,然后执行该查询,它将返回整个文档,因为这是.所代表的:当前上下文项。这里,BaseX从约定中了解这个上下文,它默认执行对当前加载的文档的查询,就像命令行解释器假定当前目录作为当前上下文一样。可以说,通过加载文档/数据库,您可以将cd转换为该文档的根目录。到现在为止还挺好...

一旦使用XQuery,您就会使用完整的编程语言,除了查询单个文档之外,还可以使用更多的语言。您可以在一个脚本中查询一大堆文档。

拿这个(不完整的)代码片段:

let $db  := db:open("list")
let $db2 := db:open("list2")

如果您现在按照您的方式进行查询,他们会去哪里?他们使用$db作为背景或$db2

您需要做的是告诉处理器这个。这可以通过以下几种方式完成:

  1. 在你的剧本的序言中:declare context item := db:open("list");(另见:BaseX documentation on this,非常重要,read about the difference between "static context" and "dynamic context" here),以了解更多有关背景的信息。
  2. 在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()
© www.soinside.com 2019 - 2024. All rights reserved.