Запрос XPath 1.0, который обрабатывает два случая - PullRequest
3 голосов
/ 09 августа 2011

Я не очень опытен в XPaths, но я долго пытался и много искал, не придя к решению.

Я извлекаю информацию из 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, я бы согласился с «Некоторым заголовком Некоторым другим текстом» или чем-то подобным.

С XPath 2.0 это не проблема, но обстоятельства ограничивают меня функциональностью в наборе "core" 1.0.

Мой вопрос заключается в том, возможно ли такое поведение в одном запросе XPath 1.0, или я должен отказаться от него?

С уважением / Магнус

Ответы [ 3 ]

1 голос
/ 09 августа 2011

Поскольку в 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()] )
1 голос
/ 09 августа 2011

Попробуйте этот XPath:

//div[@class = 'preamble'] 
    | //body/*[not(preceding-sibling::div[@class = 'preamble']) 
        and not(self::div[@class = 'preamble'])]
0 голосов
/ 09 августа 2011

Я думаю, что вы используете этот XPath 1.0:

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

В первом пути расположения выберите все текстовые узлы внутри div.Другой выберет все текстовые узлы внутри тела без этого div.Объединение (|) обоих выделит нужный текст.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...