处理两种情况的XPath 1.0查询

时间:2011-08-09 06:54:41

标签: java xml xhtml xpath

我在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标签下的其他文本。

在这种情况下,我想得到“一些文字1”,但如果没有div我就可以使用“Some some some some some some text”或其他内容。

使用XPath 2.0没有问题,但是情况限制了我对“核心”1.0集中的功能。

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

问候/马格努斯

3 个答案:

答案 0 :(得分:1)

试试这个XPath:

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

答案 1 :(得分:1)

由于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()] )

答案 2 :(得分:0)

我认为你知道这个XPath 1.0:

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

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