2013-03-12 4 views
1

Можно ли найти абзацы только с якорями (и необязательными пробелами) в качестве детей с использованием XPath? Я могу дойти до «// p [a и not (* [not (self :: a)] или text())]», который прекрасно работает, если между абзацем и тегами привязки нет пробелов.Могу ли я найти абзацы только с якорями в качестве детей, использующих xpath?

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

 
    <p><a>link</a></p> 
    <p> <a>link with leading spaces</a></p> 
    <p><a>link with trailing spaces</a> </p> 
    <p> <a>link with leading and trailing spaces</a> </p> 
Но который не соответствует этим:
 
    <p>Intro text <a>link</a> outro text.</p> 
    <p><a>link</a> outro text.</p> 
    <p>Intro text <a>link</a></p> 

ответ

0

я нахожу следующее немного лучше, чем решение @ WST и он также работает с XPath 1.0:

//p[a and not(*[not(self::a)] or text()[normalize-space()])] 
+0

Пока мне нравится эта простота! –

1

Закрыть. Используйте normalize-space:

//p[a and not(*[not(self::a)] or normalize-space(string-join(text(),"")))] 

string-join используется, чтобы обойти тот факт, что нормализуют-пространство принимает только одну строку в качестве входных данных.

1

Я решил это так:

Вы ищете все <p> элементы, которые содержат <a> элемента и из которых их нормированного-текст равен нормализованной текст <a> дочернего элемента:

//p[a and normalize-space(.) = normalize-space(a)] 

Для примера он будет возвращать следующие результаты (Demo):

0: <p><a>link</a></p> 
1: <p> <a>link with leading spaces</a></p> 
2: <p><a>link with trailing spaces</a> </p> 
3: <p> <a>link with leading and trailing spaces</a> </p> 

С вашими конкретными примерами данными можно даже избавить второй normalize-space функции:

//p[a and normalize-space(.) = a] 

однако, что может быть слишком хрупким для что вы ищете. Это совместимый с Xpath 1.0.

+0

Это очень приятное решение, но оно также будет соответствовать абзацам с пустыми элементами, отличными от ''. Смотрите эту [вилку своей демонстрации] (http://eval.in/12633). – nwellnhof