在 XPath 中使用 OR 运算符

Using OR operator in XPath

我在 XPath 表达式中使用 OR 运算符(不止一次)在遇到特定字符串之前在内容中提取我需要的内容,例如 'Reference,' 'For more information,' 等。这些术语中的任何一个都应该 return 相同的结果,但它们可能不是这个顺序。例如,'Reference' 可能不是第一个,也可能根本不在内容中,其中一个匹配项使用 table,'About the data.' 我希望所有内容都在这些字符串中的任何一个之前出现。

如有任何帮助,我们将不胜感激。

$expression =
    "//p[
        starts-with(normalize-space(), 'Reference') or 
        starts-with(normalize-space(), 'For more')
    ]/preceding-sibling::p";

这还需要考虑 table:

$expression =
    "//article/table/tbody/tr/td[
        starts-with(normalize-space(), 'About the data used')
]/preceding-sibling::p";

这是一个例子:

<root>
    <main>
        <article>
            <p>
                The stunning increase in homelessness announced in Los Angeles
                this week — up 16% over last year citywide — was an almost an
                incomprehensible conundrum.
            </p>
            <p>
                "We cannot let a set of difficult numbers discourage us
                or weaken our resolve" Garcetti said.
            </p>
            <p>
                References
                By Jeremy Herb, Caroline Kelly and Manu Raju, CNN
            </p>
            <p>
                For more information: Maeve Reston, CNN
            </p>
            <p>Maeve Reston, CNN</p>
            <table>
                <tbody>
                    <tr>
                        <td>
                            <strong>About the data used</strong>
                        </td>
                    </tr>
                    <tr>
                        <td>From
                        </td>
                        <td>Washington, CNN</td>
                    </tr>
                </tbody>
            </table>
        </article>
    </main>
</root>

我正在寻找的结果如下。

<p>
    The stunning increase in homelessness announced in Los Angeles
    this week — up 16% over last year citywide — was an almost  an
    incomprehensible conundrum.
</p>
<p>
    "We cannot let a set of difficult numbers discourage us
    or weaken our resolve" Garcetti said.
</p>

I want all content before any one of these strings appears.

也就是说,您希望第一段之前的内容包含这些字符串之一。

包含这些字符串之一的段落是:

p[starts-with(normalize-space(), 'References') or starts-with(....)]

第一个这样的段落是

p[starts-with(normalize-space(), 'References') or starts-with(....)][1]

之前的段落是:

p[starts-with(normalize-space(), 'References') or starts-with(....)][1]
/preceding-sibling::p

在 2.0 中我可能会使用正则表达式:

p[matches(., '^\s*(References|For more information)')]

避免重复调用 normalize-space()。