Упорядочение результатов запроса DOMXPath по глубине узла - PullRequest
2 голосов
/ 19 января 2011

Приведенный ниже пример фрагмента документа:

<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 делает больше, чем простоуместно здесь, для других ненужных деталей реализации.Я просто собрал этот пример вместе с того места, где я сейчас нахожусь.

1 Ответ

0 голосов
/ 03 марта 2011

Я закончил с usort() Манипулирование деревом DOM становилось все более сложным, поэтому была необходима функция обратного вызова.

...