xPath с необязательным дочерним элементом (который должен быть возвращен, если он существует)

Я использую функции xPath PHP DOMDocument.

Допустим, у меня есть HTML-код ниже (чтобы проиллюстрировать мою проблему):

<span class="price">$5.000,00</span>
<span class="newPrice">$4.000,00</span>

Первая строка всегда доступна, но в некоторых случаях ‘newPrice-class’ находится в HTML.

Я использовал это xPath-выражение, но оно всегда возвращает «ценовой класс», даже когда другое присутствует. Когда присутствует класс newPrice, я хочу только это значение. Если его нет, то я хочу значение класса «цена».

//span[@class='price'] | //[span[@class='newPrice']

Как мне этого добиться? Есть идеи?

1

Решение

Возможно, это поможет сформулировать условие по-другому:

Вы хотите выбрать <span> элемент с class="price" только если нет ни одного с class="newPrice", Иначе ты хочешь тот с class="newPrice",

//span[(not(//span[@class="newPrice"]) and @class="price") or @class="newPrice"]

Это выражение Xpath вернет искомый элемент.

Объяснение: Первое условие может быть записано в предикате следующим образом:

not(//span[@class="newPrice"]) and @class="price"

Второе условие, как будто у вас уже было:

@class="newPrice"

С правильной скобкой вы можете объединить это с or оператор:

//span[
(
not(//span[@class="newPrice"])
and @class="price")
or
@class="newPrice"]

И так как вы хотите получить значения цены в виде строки, это выглядит так в примере кода PHP:

$doc = new DOMDocument();
$doc->loadHTML($html);
$xpath = new DOMXPath($doc);

$expression = 'string(//span[(not(//span[@class="newPrice"]) and @class="price") or @class="newPrice"])';

echo "your price: ", $xpath->evaluate($expression), "\n";

Выход:

your price: $4.000,00
4

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]