Есть ли динамическое связывание в XQuery? - PullRequest
0 голосов
/ 07 июня 2018

Я изучаю XQuery и то, как он используется для запроса документов XML вместе с SQL, и я узнал, что XQuery версии 1.0 не поддерживает динамическое связывание или объектно-ориентированный дизайн, что означает, что XQuery не очень полезен для больших программ.Я могу ошибаться, но не было ли динамическое связывание введено в XQuery 3.0?Если да, то можете ли вы привести простой пример?

Ответы [ 2 ]

0 голосов
/ 09 июня 2018

При использовании языка, подобного XQuery, старайтесь не вводить его в другую парадигму: не пытайтесь использовать подход, который работает с одним языком (или семейством языков), когда это не подходит.

Языки построены вокруг моделей данных, а модель данных XDM построена на XML, а XML был разработан для разметки документов.Это влияет на мышление дизайнеров, и чтобы успешно использовать его, нужно понимать это мышление.Он не объектно-ориентирован, потому что документы не объектно-ориентированы.

XQuery 1.0, как вы говорите, не имеет динамического связывания или полиморфизма, и это действительно затрудняет решение некоторых проблем (документы, безусловно, часто бывают очень полиморфными.).Наверное, поэтому XSLT сохранил свою популярность в конкурентной борьбе.Конечно, есть причина, которая заключается в том, что XQuery, поскольку он статически анализируем, очень поддается оптимизации, которая имеет огромное значение при запросах больших баз данных.

XQuery 3.0 ввел динамическое связываниечерез механизм первоклассных функций.Этот подход отличается от наследования и полиморфизма объектно-ориентированных языков, но он не менее мощный, и у него есть то преимущество, что он не мешает статической оптимизации, когда вы его не используете.

0 голосов
/ 07 июня 2018

Есть Функции высшего порядка :

fn: function-lookup () Возвращает функцию с заданным именем и арностью, если она есть.

Выражение fn:function-lookup(xs:QName('fn:substring'), 2)('abcd', 2) возвращает 'bcd'.

fn: function-name () Возвращает имя указанной функциипо элементу функции.

Выражение fn:function-name(fn:substring#2) возвращает fn:QName("http://www.w3.org/2005/xpath-functions", "fn:substring").(Префикс пространства имен возвращенного QName не предсказуем.).

fn: function-arity () Возвращает арность функции, определенной элементом функции.

Выражение fn:function-arity(fn:substring#2) возвращает 2.

fn: apply ()

Выражениеfn:apply(fn:concat#3, ["a", "b", "c"]) возвращает "abc".

...