Выражение 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(), Но вы еще не сказали, что хотите делать, если есть нечисловые атрибуты.

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