使用 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 节

等等

这就是我难过的地方。有什么想法吗?

再次使用parentancestor轴到"climb down the tree"。如果您在文本节点处,并且想要父节点(包含文本节点),请使用 $hit/parent::*。如果您想找到匹配的章节,请转到 $hit/ancestor::div[@class="chapter"](其他元素也类似)。

对于嵌套章节的情况,添加位置谓词 [1] 以查找最具体的祖先。

请注意 class attribute might contain multiple classes,匹配时需要特殊处理!