XPath: как получить содержимое только тех узлов, которые находятся внутри родителей с нужным названием?

Разбираю html с такой структурой:

<div class="versions">
    <div class="meld" data-versions-items="2021 г.">
         <a href="https://www.englishforcing.ru/novosti/po-anglijski-v-budushhem-budut-govorit-s- 
         indijskim-akcentom-britanskij-lingvist/"></a>
    </div>
    
    <div class="meld" data-versions-items="2020 г.">
         <a href="https://www.englishforcing.ru/novosti/po-anglijski-v-budushhem-budut-govorit-s- 
         indijskim-akcentom-britanskij-lingvist/"></a>
    </div>
        <div class="meld" data-versions-items="2019 г.">
      <a href="https://www.englishforcing.ru/novosti/po-anglijski-v-budushhem-budut-govorit-s-indijskim-akcentom-britanskij-lingvist/"></a>
    </div>
</div>

Хочу с помощью XPath забрать одним запросом все ссылки за 2020, 2019 года, а за 2021, допустим, не брать.. Как мне получить ссылки из всех узлов за нужные года...? Пробовал так:

$document = new DOMDocument();
    $document->loadHTML($html);
    
    $xpath = new DOMXpath($document);

$elements = $xpath->query('//div[contains(@class,"versions")]');

и так:

$document = new DOMDocument();
        $document->loadHTML($html);
        
        $xpath = new DOMXpath($document);

$experiments = $xpath->query('//div[contains(@data-versions-items,"2020 г.")]');

За 2020 год дает информацию, но мне хотелось бы за несколько лет и обойтись без подстановки нескольких возможных вариантов в цикле, потому что тогда будет несколько xpath зарпосов, а это избыточно..

Можно ли добиться нужного результата и как? Я уже не знаю, что попробовать..


Ответы (1 шт):

Автор решения: Yitzhak Khabinsky

Для XPath 2.0 и новее.

Основано на идее последовательностей (sequences).

XPath 2.0 или новее

/div/div[substring(@data-versions-items,1,4)=("2019","2020")]

XPath 1.0

/div/div[substring(@data-versions-items,1,4)="2019" or substring(@data-versions-items,1,4)="2020"]

введите сюда описание изображения

→ Ссылка