Мне нужно получить родительский узел для дочернего узла title 50
На данный момент я использую только
//*[title="50"]
Как я мог получить его родителя? Результатом должен быть store
узел.
<?xml version="1.0" encoding="utf-8"?>
<d:data xmlns:d="defiant-namespace" d:mi="23">
<store d:mi="22">
<book price="12.99" d:price="Number" d:mi="4">
<title d:constr="String" d:mi="1">Sword of Honour</title>
<category d:constr="String" d:mi="2">fiction</category>
<author d:constr="String" d:mi="3">Evelyn Waugh</author>
</book>
<book price="8.99" d:price="Number" d:mi="9">
<title d:constr="String" d:mi="5">Moby Dick</title>
<category d:constr="String" d:mi="6">fiction</category>
<author d:constr="String" d:mi="7">Herman Melville</author>
<isbn d:constr="String" d:mi="8">0-553-21311-3</isbn>
</book>
<book price="8.95" d:price="Number" d:mi="13">
<title d:constr="String" d:mi="10">50</title>
<category d:constr="String" d:mi="11">reference</category>
<author d:constr="String" d:mi="12">Nigel Rees</author>
</book>
<book price="22.99" d:price="Number" d:mi="18">
<title d:constr="String" d:mi="14">The Lord of the Rings</title>
<category d:constr="String" d:mi="15">fiction</category>
<author d:constr="String" d:mi="16">J. R. R. Tolkien</author>
<isbn d:constr="String" d:mi="17">0-395-19395-8</isbn>
</book>
<bicycle price="19.95" d:price="Number" d:mi="21">
<brand d:constr="String" d:mi="19">Cannondale</brand>
<color d:constr="String" d:mi="20">red</color>
</bicycle>
</store>
</d:data>
parent::*
сокращенный синтаксис..
(пример://*[title="50"]/..
) или вложенный предикат (пример://*[*[title="50"]]
)parent::node()
что соответствует ярлыку..
и лучше на мой взгляд. Фактическиparent::*
ограничивается типом главного узла оси, что в большинстве случаев не является проблемой..xpath('..')
илиxpath('parent::node()')
bicycle
родителем, а родительstore
? Это восхождение? Если нет, есть ли способ подняться в таких случаях и вернуть,None
если такого родителя нет?Так же, как альтернативу, вы можете использовать
ancestor
.Это более мощный, чем,
parent
поскольку он может получить даже прародителя или прадедаисточник
Вы также можете использовать две точки в конце выражения. Смотрите этот пример:
источник
Новый, улучшенный ответ на старый, часто задаваемый вопрос ...
Используйте предикат, а не ось
parent::
илиancestor::
Большинство ответов здесь выбирают
title
и затем переходят к целевомуstore
элементу parent или ancestor ( ). Более простой, прямой подход состоит в том, чтобы сначала выбрать родительский элемент или элемент-предок непосредственно, избегая необходимости проходить по осям aparent::
илиancestor::
:Если промежуточные элементы различаются по названию:
Или по названию и по глубине:
источник
Это работает в моем случае. Я надеюсь, что вы можете извлечь смысл из этого.
источник