//div[@class="wrapper"]//(div|li)[@class="target"]/a
является действительным XPath 2.0 выражением, но не XPath 1.0 .Ваш движок PHP, вероятно, будет переведен на XPath 1.0 .
Если вы беспокоитесь о производительности вашего второго XPath //div[@class="wrapper"]//*[self::div or self::li][@class="target"]/a
, первый профиль и показатель, чтобы увидеть, работает ли он в пределахдопустимые диапазоны.Вы можете обнаружить, что он работает достаточно хорошо или так же, как ваш первый пример, и что вам не нужно беспокоиться о разнице.
В качестве альтернативы, которую можно также протестировать и измерить производительность, можно переместить предикат, ограничивающий элементы, у которых атрибут класса равен «target», до того, как предикат протестирует элементы div
или li
:
//div[@class="wrapper"]//*[@class="target"][self::div or self::li]/a
или объедините их в один предикат:
//div[@class="wrapper"]//*[@class="target" and (self::div or self::li)]/a