使用 XQuery 搜索 HTML 并返回父节点
Searching HTML with XQuery and returning the parent node
我在 eXist-db 中继承了一个 XQuery 应用程序 运行,并且我已经能够学习足够多的 XQuery 来稍微整理一下它,但我正在为我需要的最后改变而苦苦挣扎做。
该应用有一个 HTML 文件以下列格式存储在集合中:
<html>
<head>...</head>
<body>
<div class="part">
<div class="chapter">
<div class="section">
<p>Text 1</p>
<p>Text 2</p>
<p>Text 3</p>
</div>
<div class="section">
<p>Text 4</p>
<p>Text 5</p>
<p>Text 6</p>
</div>
</div>
</div>
...
<div class="part">
<div class="chapter">
<div class="section">
<p>Text 1</p>
<p>Text 2</p>
<p>Text 3</p>
</div>
<div class="section">
<p>Text 1</p>
<p>Text 2</p>
<p>Text 3</p>
</div>
</div>
</div>
...
</body>
</html>
<body>
有多个"part",每个"part"有多个"chapter",它们本身可以有多个"section"等
我正在尝试做一个搜索功能,我得到了以下有效的代码,但不是我需要的:
declare function app:search-result($node as node(), $model as map(*), $q as xs:string) {
let $content := doc("/db/apps/EI/resources/publications/EI.html"))
for $hit in $content//p[ft:query(., concat("'", $q, "'"))]
order by ft:score($hit) descending
return
$hit
};
目前函数只returns找到<p>
中的纯文本,但我需要的是找出它在[中找到的每个部分、章节和部分DIVs =15=]
例如,如果我搜索 "text 1",我需要知道它位于:
第 1 部分,第 1 章,第 1 部分
第 2 部分,第 1 章,第 1 部分
第 2 部分,第 1 章,第 2 节
等等
这就是我难过的地方。有什么想法吗?
再次使用parent
或ancestor
轴到"climb down the tree"。如果您在文本节点处,并且想要父节点(包含文本节点),请使用 $hit/parent::*
。如果您想找到匹配的章节,请转到 $hit/ancestor::div[@class="chapter"]
(其他元素也类似)。
对于嵌套章节的情况,添加位置谓词 [1]
以查找最具体的祖先。
请注意 class attribute might contain multiple classes,匹配时需要特殊处理!
我在 eXist-db 中继承了一个 XQuery 应用程序 运行,并且我已经能够学习足够多的 XQuery 来稍微整理一下它,但我正在为我需要的最后改变而苦苦挣扎做。
该应用有一个 HTML 文件以下列格式存储在集合中:
<html>
<head>...</head>
<body>
<div class="part">
<div class="chapter">
<div class="section">
<p>Text 1</p>
<p>Text 2</p>
<p>Text 3</p>
</div>
<div class="section">
<p>Text 4</p>
<p>Text 5</p>
<p>Text 6</p>
</div>
</div>
</div>
...
<div class="part">
<div class="chapter">
<div class="section">
<p>Text 1</p>
<p>Text 2</p>
<p>Text 3</p>
</div>
<div class="section">
<p>Text 1</p>
<p>Text 2</p>
<p>Text 3</p>
</div>
</div>
</div>
...
</body>
</html>
<body>
有多个"part",每个"part"有多个"chapter",它们本身可以有多个"section"等
我正在尝试做一个搜索功能,我得到了以下有效的代码,但不是我需要的:
declare function app:search-result($node as node(), $model as map(*), $q as xs:string) {
let $content := doc("/db/apps/EI/resources/publications/EI.html"))
for $hit in $content//p[ft:query(., concat("'", $q, "'"))]
order by ft:score($hit) descending
return
$hit
};
目前函数只returns找到<p>
中的纯文本,但我需要的是找出它在[中找到的每个部分、章节和部分DIVs =15=]
例如,如果我搜索 "text 1",我需要知道它位于:
第 1 部分,第 1 章,第 1 部分
第 2 部分,第 1 章,第 1 部分
第 2 部分,第 1 章,第 2 节
等等
这就是我难过的地方。有什么想法吗?
再次使用parent
或ancestor
轴到"climb down the tree"。如果您在文本节点处,并且想要父节点(包含文本节点),请使用 $hit/parent::*
。如果您想找到匹配的章节,请转到 $hit/ancestor::div[@class="chapter"]
(其他元素也类似)。
对于嵌套章节的情况,添加位置谓词 [1]
以查找最具体的祖先。
请注意 class attribute might contain multiple classes,匹配时需要特殊处理!