2011-03-14 3 views
2

У меня есть этот DIV:PHP простого XPath вопрос

<div class="product-name">Product1</div> 

У меня также есть этот DIV:

<div class="product-name gold">Product2</div> 

Как я могу изменить этот XPATH запрос, чтобы получить все дивы, который содержит название-продукт ? Вместо получения точного соответствия.

/html/body//div[@class='product-name'] 

Я гугл, но все, что я смог найти, как использовать contains при поиске значения в пределах узла, а не атрибут.

EDIT enter image description here

+0

просьба представить исходный документ. –

+0

@Alex, почему вам нужно видеть какой-либо источник, кроме того, что я предоставил? –

+0

Действительный XML должен иметь только один корневой узел. Оберните свои divs ' ..' и все будет в порядке. –

ответ

1

Вы можете использовать contains():

/html/body//div[contains(@class, 'product-name')] 

Update:

Как @Alejandro точки в своем комментарии, это также будет соответствовать любой класс, который содержит product-name. See his answer for a XPath 1.0 solution.

Если вы используете XPath 2.0, вы также можете сделать это:

/html/body//div[exists(index-of(tokenize(@class, "\s+"), "product-name"))] 
+0

Не выбирает второй div, также проверен здесь http://emdin-here.ru/r/xpath_checker/ –

+0

@OrW: Это решение является правильным (по вашему вопросу). Если это не сработает для вас, ваш вопрос не отражает вашу проблему. – Tomalak

+0

@OrW: Он работает для меня. Вы передаете правильный документ? Если вы используете точный XPath выше, документ должен содержать узлы 'html' и' body'. Или удалите '/ html/body' из пути и повторите попытку. –

0

/html/body//div[contains(@class,'product-name')]

Атрибуты также узлы, они называются узлами атрибутов.

+0

По какой-то причине, который по-прежнему не берет '' название продукта gold'' –

+0

, убедитесь, что ваш код верен. Часть '// div' верна и соответствует вашим требованиям. Убедитесь, что не соответствующий div является потомком '/ html/body'. Вы можете проверить этот XPath f.i. на http://www.xmlme.com/XpathTool.aspx –

2

Классическим XPath 1.0 Ответ на этот экзистенциальное испытание на последовательности:

/html/body//div[ 
    contains(
     concat(' ',normalize-space(@class),' '), 
     ' product-name ' 
    ) 
] 
+0

+1 для более надежного решения. –

+0

+1 для общего подхода. – Flack

Смежные вопросы