По причинам, выходящим за рамки этого вопроса, мне нужно иметь возможность обрабатывать несколько XML-документов с одинаковой структурой, но принадлежащих к разным пространствам имен (не спрашивайте).
Чтобы достичь этого, я очень привык использовать xpath, подобный следующему, для многих моих вариантов выбора значений:
//*[local-name()='apple']/*[local-name()='flavor']/text()"
Мое непонимание предикатов не позволяет мне выбрать значение узла на основе значения родственного узла. Рассмотрим следующий xml:
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<fruit>
<apple>
<kind>Red Delicious</kind>
<flavor>starchy</flavor>
</apple>
<apple>
<kind>Granny Smith</kind>
<flavor>tart</flavor>
</apple>
<apple>
<kind>Pink Lady</kind>
<flavor>sweet</flavor>
</apple>
</fruit>
Допустим, я хочу написать xpath, который будет выбирать вкус яблока Granny Smith. Хотя обычно я делаю что-то вроде:
//apple[kind/text()='Granny Smith']/flavor/text()
Я не могу понять, как объединить концепцию использования local-name(), чтобы быть независимым от пространства имен, при этом выбирая узел на основе значения родственного элемента.
Короче говоря, какой xpath необходим для возврата «пирога» независимо от того, к какому пространству имен принадлежит входной XML-документ фруктов?