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, связанный с соответствующим element
value
приписывать. Если предыдущие два утверждения не совсем читабельны (мой английский сейчас немного ржавый), я бы хотел добиться этого:
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, который является надмножеством).