我有以下脚本:
<?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”开头的类别的名称,其子项的id是122.我知道第一部分XPath是对的,但我不知道如何做“其孩子是”的部分。
输出应该是Kitchen。
我知道可以显示排序开始为00A的所有类别名称,然后如果商品数组包含122,则可以在PHP中进行测试。但我认为如果可能的话,在XPath中立即使用它会更快。
谢谢!
答案 0 :(得分: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
}