XPath: рекурсивный поиск предков

С выбранным моим текущим узлом я хочу найти элемент <name> [./name] и вернуть текстовое содержимое. Если элемент <name> не существует в текущем выбранном узле, я хочу проверить родительский элемент [./parent::name] и так далее рекурсивно до корня, возвращая значение ближайшего родителя, где элемент существует.

Можно ли это сделать с помощью XPath?


person djskinner    schedule 01.09.2009    source источник


Ответы (1)


(Редактировать: я неправильно истолковал вопрос в первый раз)

я предлагаю использовать

ancestor-or-self::name[1]

Это находит все элементы name, начиная с self, parent и т. д., и упорядочивает их по возрастанию расстояния от себя. Таким образом, выбор [1] дает вам ближайший.

person Martin v. Löwis    schedule 01.09.2009
comment
Основываясь на вашем первоначальном ответе, я использовал ancestor-or-self::*[name][1]/name. Есть ли разница и какой предпочтительнее? - person djskinner; 01.09.2009
comment
Есть разница: ваша форма может выбрать несколько элементов имени. Например. если вы ищете элементы таблицы в HTML, это даст вам все одноуровневые таблицы для вашей таблицы-предка, что не совсем то, что вам нужно (IIUC). Кроме того, в XPath обычно лучше использовать меньший термин и исключить все избыточные выражения. Это не только ускорит вычисление, но и сделает выражение более понятным, поскольку XPath трудно читать как для записи, так и для чтения. - person Martin v. Löwis; 01.09.2009
comment
Я не могу заставить это вернуть какие-либо совпадения, где ancestor-or-self::*[name][1]/name дает желаемый результат (отрицая упомянутые вами последствия) - person djskinner; 02.09.2009
comment
ancestor-or-self::*/SURNAME[1] вроде работает. Представляет ли это выражение какие-либо собственные проблемы? - person djskinner; 02.09.2009
comment
Если это работает, а ancestor-or-self::SURNAME нет, то SURNAME не является предком. Это правильно? Проблема с вашим текущим выражением заключается в том, что оно дает вам всех первых детей SURNAME любого предка. Поэтому, если у вас есть несколько предков, у которых есть дочерние элементы SURNAME, вы все равно можете получить несколько результатов. - person Martin v. Löwis; 02.09.2009
comment
А, теперь я понимаю, как работает это выражение. Это желаемое поведение, и никогда не бывает нескольких элементов SURNAME. ФАМИЛИЯ всегда является дочерним элементом оси предок или я. - person djskinner; 02.09.2009