处理两种情况的 XPath 1.0 查询

发布于 2024-11-28 17:54:51 字数 675 浏览 0 评论 0原文

我在 XPath 方面经验不是很丰富,但我已经尝试了很长一段时间并进行了很多搜索,但没有找到解决方案。

我从 XHTML 中提取信息,这些信息大多看起来像

<html>
    <head></head>
    <body>
        <div class="preamble">
            <p>Some text 1</p>
        </div>
        <h1>Some headline</h1>
        <p>Some other text</p>
    </body>
</html>

我最感兴趣的是序言 div 中包含的文本,它存在于我的大多数文档中。问题是缺少 div,在这些情况下我想提取 body 标签下的其他文本。

在这种情况下,我想得到“Some text 1”,但如果没有 div,我可以选择“Some title Some other text”或其他内容。

使用 XPath 2.0 没问题,但环境限制我只能使用“核心”1.0 集中的功能。

我的问题是这种行为在一个 XPath 1.0 查询中是否可能,或者我是否应该放弃它?

问候/马格努斯

I'm not very experienced in XPaths but I have tried a good while and searched alot without coming up with a solution.

I'm extracting information from XHTML that mostly looks something like

<html>
    <head></head>
    <body>
        <div class="preamble">
            <p>Some text 1</p>
        </div>
        <h1>Some headline</h1>
        <p>Some other text</p>
    </body>
</html>

What I'm mostly interested in is the text contained in the preamble div, which exists in most of my documents. The problem is the ones lacking the div, in these cases I'd like to extract the other text under the body tag.

In this case I'd like to get "Some text 1" but if there was no div I'd be ok with "Some headline Some other text" or something.

With XPath 2.0 it's no problem, but circumstances limits me to the functionality in the "core" 1.0 set.

My question is whether this behaviour is possible in one XPath 1.0 query, or whether I should give up on it?

Regards /Magnus

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(3

愁以何悠 2024-12-05 17:54:51

试试这个 XPath:

//div[@class = 'preamble'] 
    | //body/*[not(preceding-sibling::div[@class = 'preamble']) 
        and not(self::div[@class = 'preamble'])]

Try this XPath:

//div[@class = 'preamble'] 
    | //body/*[not(preceding-sibling::div[@class = 'preamble']) 
        and not(self::div[@class = 'preamble'])]
不寐倦长更 2024-12-05 17:54:51

由于 XPath 1.0 没有指定节点集的顺序,因此您需要确保两种情况是互斥的。

string( /html/body/div[@class='preamble'] | /html/body[not(div[@class='preamble'])] )

如果您的 XPath 处理器按文档顺序返回节点集,则可以使用更简单的查询:

string( (/html/body/div[@class='preamble'] | /html/body)[last()] )

Since XPath 1.0 does not specify an ordering for nodesets, you want to ensure that your two cases are exclusive.

string( /html/body/div[@class='preamble'] | /html/body[not(div[@class='preamble'])] )

If your XPath processor returns nodesets in document order, a simpler query will do:

string( (/html/body/div[@class='preamble'] | /html/body)[last()] )
关于从前 2024-12-05 17:54:51

我认为您需要这个 XPath 1.0:

"/html/body/div[@class='preamble']//text()
|
/html/body[not(div/@class='preamble')]//text()"

第一个位置路径选择 div 内的所有文本节点。另一个将选择正文中没有该 div 的所有文本节点。两者的联合 (|) 将选择所需的文本。

I think you neet this XPath 1.0:

"/html/body/div[@class='preamble']//text()
|
/html/body[not(div/@class='preamble')]//text()"

The first location path select all text nodes inside the div. The other will select all text nodes inside a body without that div. The union (|) of both will select the wanted text.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文