Следующая структура 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.