Но когда я пытаюсь вывести текст
каждый конкретный узел
//*[contains(./*,'Lockwood')][1]
//*[contains(./*,'Lockwood')][2]
//*[contains(./*,'Lockwood')][3]
Узел 1 содержит весь текст
а узлы 2 и 3 пустые
Это часто задаваемые вопросы.
//SomeExpression[1]
не эквивалентен
(//someExpression)[1]
Первый выбирает все //SomeExpression
узлы, которые являются первыми дочерними элементами их родителей.
Последний выбирает первый (в порядке документа) из всех //SomeExpression
узлов во всем документе.
Как это относится к вашей проблеме?
//*[contains(./*,'Lockwood')][1]
При этом выбираются все элементы, у которых есть хотя бы один дочерний элемент, строковое значение которого содержит «Lockwood» и которые являются первым таким дочерним элементом их родительского элемента. Все три элемента с текстовым узлом, содержащим строку «Локвуд», являются первым таким потомком их родителей, поэтому в результате выбираются три элемента.
//*[contains(./*,'Lockwood')][2]
Нет элемента, у которого есть дочерний элемент со строковым значением, содержащий строку 'Lockwood', и который является вторым таким дочерним элементом его родителя. Узлы не выбраны.
//*[contains(./*,'Lockwood')][3]
Нет элемента, у которого есть дочерний элемент со строковым значением, содержащий строку 'Lockwood', и который является третьим таким дочерним элементом его родителя. Узлы не выбраны.
Решение
Использование:
(//*[contains(./*,'Lockwood')])[1]
(//*[contains(./*,'Lockwood')])[2]
(//*[contains(./*,'Lockwood')])[3]
Каждый из них выбирает именно N-й элемент (N = {1,2,3}), выбранный с помощью //*[contains(./*,'Lockwood')]
, соответственно: BusinesLetter
, Recipient
и Body
.
Помните
Оператор []
имеет более высокий приоритет (приоритет), чем сокращение //
.