Избегайте скобок в пути, используя XPath 1.0 - PullRequest
0 голосов
/ 03 апреля 2019

Следующая структура XML представляет веб-сайт со многими статьями. Каждая статья содержит, помимо прочего, дату ее создания и, возможно, произвольно много дат ее модификации. Я хочу получить дату последнего доступа (либо создание, либо последнее изменение) к каждой статье с использованием XPath 1.0.

<website>
    <article>
        <date><strong>22.11.2017</strong></date>
        <edits>
            <edit><strong>17.12.2017</strong></edit>
        </edits>
    </article>
    <article>
        <date><strong>17.4.2016</strong></date>
        <edits></edits>
    </article>
    <article>
        <date><strong>3.5.2011</strong></date>
        <edits>
            <edit><strong>4.5.2011</strong></edit>
            <edit><strong>12.8.2012</strong></edit>
        </edits>
    </article>
    <article>
        <date><strong>12.2.2009</strong></date>
        <edits></edits>
    </article>
    <article>
        <date><strong>23.11.1987</strong></date>
        <edits>
            <edit><strong>3.4.2001</strong></edit>
            <edit><strong>11.5.2006</strong></edit>
            <edit><strong>13.9.2012</strong></edit>
        </edits>
    </article>
</website>

Другими словами, ожидаемый результат:

<strong>17.12.2017</strong>
<strong>17.4.2016</strong>
<strong>12.8.2012</strong>
<strong>12.2.2009</strong>
<strong>13.9.2012</strong>

Пока я только создал этот путь:

//article/*[self::date or self::edits/edit][last()]

, который ищет date и непустые edits узлы в каждом article и выбирает последний. Но я не знаю, как получить доступ к последним strong каждого такого выбора, и наивный //strong[last()], добавленный в конец пути, не работает.

Я нашел решение в XPath 2.0. Любой из этих путей должен работать, если я не ошибаюсь:

//article/(*[self::date or self::edits/edit][last()]//strong)[last()]
//article/(*//strong)[last()]

Такое использование скобок в пути недопустимо в XPath 1.0.

Ответы [ 2 ]

1 голос
/ 04 апреля 2019

Вот простой xpath для получения вашего вывода.

//article/descendant-or-self::strong[last()]
1 голос
/ 03 апреля 2019

Это выражение XPath 1.0

/website/article/descendant::strong[parent::date|parent::edit][last()]

Выбирает узлы:

<strong>17.12.2017</strong>

<strong>17.4.2016</strong>

<strong>12.8.2012</strong>

<strong>12.2.2009</strong>

<strong>13.9.2012</strong>

Проверено в http://www.xpathtester.com/xpath/56d8f7bc4b9c8c064fdad16f22469026

Do note : позицияпредикаты действуют над списком контекста.

...