Относительные запросы XPath, повторяющиеся по уровню - PullRequest
2 голосов
/ 07 января 2011

Я пытаюсь выяснить строку запроса XPath для выполнения следующей операции.

С учетом XML-документа, подобного следующему:

<root>
    <data>foo1</data>
    <irrelevant-node>
        <data>foo1</data>
    </irrelevant-node>
    <irrelevant-node />
    <data>foo2</data>
    <irrelevant-node />
    <region>
        <data>bar1</data>
        <data>bar2</data>
        <irrelevant-node />
        <region>
            <data>hello1</data>
            <irrelevant-node />
            <data>hello2</data>
            <region>
                <irrelevant-node />
                <data>world1</data>
            </region>
        </region>
        <irrelevant-node />
        <data>bar3</data>
        <irrelevant-node>
            <data>foo1</data>
        </irrelevant-node>
        <irrelevant-node />
    </region>
    <irrelevant-node />
</root>

Я хочу получить все <data> узлов, не содержащихся в <region>.

Затем я хочу захватить все самые верхние <region> узлы и повторить предыдущий процесс для них, работая относительно.

По существуЯ собираюсь выполнить ряд процессов (PHP) на узлах <data> на основе их содержимого, а затем заменить их.Тем не менее, <region> узлы действуют как своего рода разделитель области, и как только я закончу обработку всех <data> узлов в данной области, я перейду на уровень региона.<data> узлы могут быть вложены в другие нерелевантные узлы.

Не уверен, что XPath - лучший инструмент для этого, и у меня много проблем, пытаясь разобраться в этом.Как уже отмечалось, я использую PHP-реализацию классов DOM.

1 Ответ

3 голосов
/ 08 января 2011

По сути, я собираюсь быть выполнение ряда процессов (PHP) на узлах на основе их содержимое, а затем заменить их. Тем не менее, узлы действуют как своего рода разделитель области, и как только я закончу обработка всех <data> узлов в данном Я переезжаю на региональный уровень. <data> узлы могут быть вложены в другие нерелевантные узлы.

Используйте

//data[count(ancestor::region) = $n]

, где $n равно 0, 1, ..., максимальная глубина.

Для каждого значения $ n выражение выбирает все элементы data на "уровне $ n" .

Вы можете найти «максимальную глубину» как максимум count(ancestor::region)+1 для каждого из узлов, выбранных с помощью:

//region[not(descendant::region)]

Этот максимальный можно указать в одном выражении XPath 2.0 , но не в одном выражении XPath 1.0.

...