Приведенный ниже код выбирает таблицу, но начинается с самой внешней таблицы. я
нужно выбрать большую внутреннюю таблицу, которая содержит данную строку
Используйте
//table
[not(descendant::table)
and
.//text()[contains(., ' KDV')]
]
Это выбирает любой table
в документе XML, который не имеет потомка table
, и который имеет потомок текстового узла, который содержит строку " KDV"
.
Как правило, вышеприведенное выражение может выбирать много таких table
элементов.
Если вы хотите, чтобы был выбран только один из них (скажем, первый), используйте это выражение XPath - обратите внимание на квадратные скобки :
(//table
[not(descendant::table)
and
.//text()[contains(., ' KDV')]
]
)[1]
Помните : Если вы хотите выбрать первый элемент someName
в документе, использовать это (как в принятом в настоящее время ответе) неправильно:
//someName[1]
Это второй наиболее часто задаваемый вопрос в XPath (после того, как выбирать элементы с нефиксированными именами в документе XML с пространством имен по умолчанию).
Вышеприведенное выражение фактически выбирает любой элемент someName
в документе, то есть первый дочерний элемент его родителя - попробуйте его.
Причина такого неинтуитивного поведения заключается в том, что оператор XPath []
имеет более высокий приоритет (приоритет), чем псевдо-оператор //
.
Правильное выражение, которое действительно выбирает только первый элемент someName
(в любом документе XML), если таковой существует:
(//someName)[1]
Здесь скобки используются для явного переопределения приоритета оператора XPath по умолчанию.