Использование оператора OR в XPath - PullRequest
0 голосов
/ 11 июня 2019

Я использую оператор OR (более одного раза) в своем выражении XPath, чтобы извлечь то, что мне нужно в контенте, до того, как будет найдена конкретная строка, такая как «Ссылка», «Для получения дополнительной информации» и т. Д. Любая из этих условия должны возвращать один и тот же результат, но они могут быть не в таком порядке. Например, «Ссылка» может быть не первой и может вообще отсутствовать в контенте, а в одном из совпадений используется таблица «О данных». Я хочу, чтобы все содержимое отображалось до появления любой из этих строк.

Любая помощь будет оценена.

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

Это также необходимо учитывать таблицу:

$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>

1 Ответ

0 голосов
/ 11 июня 2019

Я хочу, чтобы все содержимое отображалось до появления любой из этих строк.

То есть вы хотите, чтобы содержимое перед первым абзацем содержало одну из этих строк.

Абзацы, содержащие одну из следующих строк:

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 ().

...