Выражение XPath 3.1 для сбора атрибутов в виде карт имя / значение для каждого выбранного узла
XPath 3.1 поддерживает новую функцию карт, которая позволяет карты в последовательностях результатов. https://www.w3.org/TR/xpath-31/
Например, вот правильное выражение XPath 3.1, которое возвращает жестко закодированную последовательность из 2 карт:
(map {'a':1,'b':2,'c':3}, map {'x':-3,'y':-2,'z':-1})
Я пытаюсь использовать эту функцию для сбора атрибутов узла в виде списка карт.
Например, для данного xml:
<root>
<node a="1" b="2" c="3"/>
<node x="-3" y="-2" z="-1"/>
</root>
Как я могу создать простое выражение XPath, чтобы получить следующий результат:
[{'a':1,'b':2,'c':3}, {'x':-3,'y':-2,'z':-1}]
1 ответ
С элементом в качестве элемента контекста вы можете сформировать карту атрибутов следующим образом:
map:merge(@* ! map{local-name(): string()})
Чтобы получить последовательность карт для последовательности элементов $in, вы можете сделать
$in ! map:merge(@* ! map{local-name(): string()})
Чтобы получить массив карт для последовательности элементов $in, вы можете сделать
array { $in ! map:merge(@* ! map{local-name(): string()}) }
В вашем примере вы также конвертируете значения атрибута в числа, поэтому вы должны использовать xs:integer(.)
на месте string()
, Но вы еще не сказали, что хотите делать, если есть нечисловые атрибуты.