XPath 2.0 - эквивалент 1.0?

У меня возникли проблемы с созданием действительного эквивалента XPath 1.0 из рабочего примера 2.0, который дал бы те же результаты (и, по сути, без сбоев). Причина, по которой я должен использовать предыдущую версию, заключается в том, что PHP не поддерживает XPath 2.0.

Мой XML выглядит так:

<root>
    <container id="1">
        <elements>
            <element value="0"/>
        </elements>
    </container>
    <container id="2">
        <elements>
            <element value="1"/>
        </elements>
    </container>
    <container id="3">
        <elements>
            <element value="1"/>
        </elements>
    </container>
</root>

Я хотел бы получить value атрибут element узел, из которого прародитель container узел имеет атрибут id равно 1 или 3. Также я хотел бы получить вышеупомянутый атрибут id, связанный с соответствующим elementvalue приписывать. Если предыдущие два утверждения не совсем читабельны (мой английский сейчас немного ржавый), я бы хотел добиться этого:

1:0
3:1

Формат такой:

[container id]:[element value]

Рабочий путь XPath 2.0, который я написал, дает ожидаемый результат:

//container[@id=1 or @id=3]//element/concat(../../@id, ":", @value)

Однако выполнение этого с использованием тестера XPath 1.0 приводит к следующей ошибке:

ERROR - Failed to evaluate XPath expression: Unknown nodetype: concat

Что меня озадачивает, поскольку concat присутствует в спецификации XPath 1.0.

Я пытался использовать разные подходы, как, например, путь:

//container[@id=1 or @id=3]/@id | //container[@id=1 or @id=3]//element/@value

Который дает набор результатов, как это:

1
0
3
1

Что я могу проанализировать проблематично для достижения ожидаемого формата, но я не уверен, будет ли объединение объединять соответствующие id а также value правильно. Кто-нибудь может указать мне правильное направление?

2 ответа

Результатом вашего выражения XPath 2.0 является последовательность строк. Это тип данных, который даже не существует в XPath 1.0. Таким образом, вам придется выполнять большую часть работы на языке хоста.

Вы не можете сделать это в простой XPath 1.0. Нет никакого способа сделать какие-либо явные циклы, пусть это будут упрощенные выражения FLWOR в XPath 2.0 или применение функций в качестве шагов оси.

Получите контейнеры в XPath и выполните дальнейшую обработку вне XPath или встраивайте процессор XPath 2.0 (или XQuery, который является надмножеством).

Другие вопросы по тегам