Очевидный способ сделать это - передать XPath в качестве третьего параметра и построить его, когда вы копаете глубже. Вы должны учитывать, что братья и сестры имеют одинаковые имена, поэтому вам нужно отслеживать количество предшествующих братьев и сестер с тем же именем, что и у текущего потомка, во время итерации.
Рабочий пример:
function xmlRecurse($xmlObj,$depth=0,$xpath=null) {
if (!isset($xpath)) {
$xpath='/'.$xmlObj->getName().'/';
}
$position = array();
foreach($xmlObj->children() as $child) {
$name = $child->getName();
if(isset($position[$name])) {
++$position[$name];
}
else {
$position[$name]=1;
}
$path=$xpath.$name.'['.$position[$name].']';
echo str_repeat('-',$depth).">".$name.": $path\n";
foreach($child->attributes() as $k=>$v){
echo "Attrib".str_repeat('-',$depth).">".$k." = ".$v."\n";
}
xmlRecurse($child,$depth+1,$path.'/');
}
}
Внимание, сама идея составления карты всего документа и хранения XPath по пути кажется странной. Возможно, вы работаете над неправильным решением совершенно другой проблемы.