Приведенный ниже пример фрагмента документа:
<html xmlns="http://www.w3.org/1999/xhtml" xmlns:zuq="http://localhost/~/zuqml">
<head></head>
<body>
<zuq:data name="a" />
<div>
<zuq:data name="b" />
</div>
<div>
<zuq:data name="c">
<zuq:format type="trim">
<zuq:param name="length">300</zuq:param>
<zuq:param name="append">
<span>
<zuq:data name="d" />
</span>
</zuq:param>
</zuq:format>
</zuq:data>
</div>
<div>
<zuq:data name="e">
<zuq:format type="trim">
<zuq:param name="length">300</zuq:param>
<zuq:param name="append">
<span>
<zuq:data name="f" />
</span>
</zuq:param>
</zuq:format>
</zuq:data>
</div>
</body>
</html>
Я пытаюсь получить узлы <zuq:data />
для манипуляции, но в определенном порядке: сначала самый глубокий .
Я сейчас дошел до этой точки:
$nodeList = $xpath->query('.//zuq:data[not(ancestor::zuq:region)]');
foreach($nodeList as $node){
$nodeOrder[] = Array($xpath->evaluate('count(ancestor::*)', $node) => $node->getAttribute('name'));
}
print_r($nodeOrder);
Что, конечно, выплевывает это:
Array
(
[0] => Array
(
[2] => a
)
[1] => Array
(
[3] => b
)
[2] => Array
(
[3] => c
)
[3] => Array
(
[7] => d
)
[4] => Array
(
[3] => e
)
[5] => Array
(
[7] => f
)
)
Теперь я подумываю просто использовать array_multi_sort()
или usort()
чтобы заказать DOMNode
объекты для манипуляции, если я буду продолжать свое текущее «решение».Тем не менее, мне кажется, что кто-то может знать более эффективный способ сделать это.
Есть мысли?
Примечание. Моя строка запроса XPath делает больше, чем простоуместно здесь, для других ненужных деталей реализации.Я просто собрал этот пример вместе с того места, где я сейчас нахожусь.