xml — PHP XPath — отображать родителя, чей ребенок

У меня есть следующий скрипт:

<?php
$xml = '<?xml version="1.0" encoding="UTF-8"?>
<root>
<category id="1" sort="00A125698" name="Kitchen">
<good id="122"/>
<good id="315"/>
<good id="94"/>
</category>
<category id="2" sort="00B354565" name="Dining room">
<good id="441"/>
<good id="122"/>
<good id="521"/>
</category>
<category id="3" sort="00A259875" name="Chairs">
<good id="335"/>
<good id="225"/>
</category>
</root>';

$data = simplexml_load_string($xml);
$cat_name = $data->xpath("/root/category[contains(@sort, '00A')] && /root/category/good[@id='122']");

$cat_name_cnt = count($cat_name);
for($i = 0; $i <$cat_name_cnt; $i++){
echo $cat_name[$i]->attributes()->name;
echo '<BR />';
}
?>

Я не знаю, возможно ли это, но я пытаюсь сделать что-то вроде: Показать название категории, где сортировка атрибута начинается с «00A», а чей идентификатор ребенка 122. Я знаю, что первая часть XPath верно, но я не знаю, как сделать часть «чей ребенок».

На выходе должна быть Кухня.

Я знаю, что было бы возможно отобразить все имена категорий, сортировка которых начинается с 00A, а затем проверить в PHP, содержит ли массив товаров 122. Но я думаю, что быстрее сделать это в XPath, если это возможно.

Спасибо!

1

Решение

Да, это вполне возможно, на самом деле вы почти там. Пример:

$data = simplexml_load_string($xml);
$cat_name = $data->xpath("/root/category[contains(@sort, '00A')][descendant::good[@id='122']]");
if(count($cat_name) > 0) {
$element = $cat_name[0];
$name = (string) $element->attributes()->name;
echo $name; // kitchen
}
1

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]