2014-11-08 3 views
0

У меня есть следующий код, и я хочу выбрать ярлык по тексту. Я не могу использовать //label[text()='some label'] или //label[text()='other label'] по двум причинам:Как выбрать узел по тексту, опускающий текст дочерних узлов

  • '// метка [текст()] возвращает все содержимое текущего узла, включая содержание SPAN в,
  • белые пространства.

Я могу использовать содержит() функцию, но я действительно НЕ хочу.

<label> 
<span>some span</span> 
    some label 
</label> 

<label> 
    other label 
<span>other span</span> 
</label> 

SOLVED ???

//label[normalize-space(text()) = 'some label'] 

Но почему это полоски внутренних узлов? Я не понимаю. Согласно http://www.w3.org/TR/xpath/#function-normalize-space, необходимо удалить только пробелы, но не узлы.

ответ

0

Если вы используете

//label[text()[normalize-space() = 'some label']] 

, то я надеюсь, что вы получите то, что вы хотите. Было бы, однако, также выбрать ярлык как

<label>text1<span>span text</span>some label</label> 

Вообще со смешанным содержимым и несколько дочерних текстовых узлов с XPath 1.0, это немного трудно для удовлетворения всех возможных случаев, с помощью XPath 2.0 вы можете сделать //label[normalize-space(string-join(text(), '')) = 'some label'], который является более точным ,

+0

Какой синтаксис лучше: // label [text() [normalize-space() = 'some label']] vs // label [normalize-space (text()) = 'some label'] –

+0

И что гораздо важнее, почему normalize-space() выравнивает внутренние узлы. Для меня это важно понять. –

+0

Вам нужно будет объяснить, что такое «внутренний узел» и какое поведение вы заметили, которое хотите объяснить, когда говорите «normalize-space() обрезает внутренние узлы». Основное различие между моим предложением '// label [text() [normalize-space() = 'some label']]' и вашим кодом заключается в том, что мое предложение выбирает элементы label, которые имеют (по крайней мере) текстовый дочерний узел чье нормализованное строковое значение является «некоторой меткой», поэтому ваша попытка выбирает элементы «label», где первый текстовый дочерний узел имеет нормализованное строковое значение «some label». И с вашим образцом первый текстовый дочерний узел - это пробел. –

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