XSLT - это функциональный язык программирования?

Несколько вопросов о языках функционального программирования заставили меня задуматься о том, является ли XSLT языком функционального программирования. Если нет, то каких функций не хватает? XSLT 2.0 сократил или ликвидировал разрыв?

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

Dimitre Novatchev 30.11.2013 02:20

Я видел, что вы отличный курс XML по множественному числу

Alex Gordon 18.07.2018 02:00
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
24
2
8 982
6
Перейти к ответу Данный вопрос помечен как решенный

Ответы 6

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

Могут быть и другие, но это очевидный ответ.

Удачи!

Ответ принят как подходящий

XSLT декларативен в отличие от состояния.

Хотя XSLT основан на идеях функционального программирования, это не полностью функциональный язык программирования, ему не хватает возможности рассматривать функции как тип данных первого класса. В нем есть такие элементы, как ленивое вычисление, чтобы уменьшить ненужное вычисление, а также отсутствие явных циклов.

Однако, как и функциональный язык, я думаю, что его можно хорошо распараллелить с помощью автоматической безопасной многопоточности на нескольких процессорах.

От Википедия по XSLT:

As a language, XSLT is influenced by functional languages, and by text-based pattern matching languages like SNOBOL and awk. Its most direct predecessor was DSSSL, a language that performed the same function for SGML that XSLT performs for XML. XSLT can also be considered as a template processor.

Вот отличный сайт по использованию XSLT как функциональный язык с помощью FXSL. FXSL - это библиотека, которая реализует поддержку функций высшего порядка.

Из-за FXSL я не думаю, что XSLT сам должен быть полностью функциональным. Возможно, в будущем FXSL будет включен в качестве стандарта W3C, но у меня нет свидетельств этого.

@recursive: это не петли в императивном смысле этого слова. Порядок выполнения не гарантируется (это упрощает параллельную реализацию). Я думаю, что близкая аналогия заключается в том, что с xsl:for-each вы создаете проекция на наборе.

Abel 04.01.2017 15:53

@Abel: Порядок вывода кажется гарантированным, и я не вижу полезного различия между фактическим порядком выполнения и порядком конечных результатов. Кажется, это деталь реализации.

recursive 04.01.2017 19:50

@recursive, именно поэтому эти циклы отличаются от циклов в императивных языках. Предположим, у вас есть xsl:message, который создает побочный эффект, не гарантируется, как часто и в каком порядке он вызывается (хотя были способы обеспечить это). Так что это не только деталь реализации. Однако это во многом свойство функционального программирования.

Abel 04.01.2017 20:05

Отличный сайт, на который вы указали, - это 404: C

Ben Leggiero 24.07.2020 23:26

Saxon-SA представила некоторые функции расширения, которые делают XSLT функциональным. Вы можете использовать saxon:function() для создания значения функции (фактически значения {http://net.sf.saxon/java-type}net.sf.saxon.expr.UserFunctionCall), которое затем вызываете с помощью saxon:call().

Saxon-B имеет аналогичную функциональность с парой saxon:expression() и saxon:eval(). Разница в том, что saxon:expression() принимает любое выражение XPath, а saxon:eval() оценивает его, тогда как saxon:function() принимает имя функции, которую вызывает saxon:call().

fwiw это также возможно в .NET снова через расширение, и imho не так элегантно

annakata 11.03.2009 15:29

Для функционального программирования в XSLT расширения не требуются, и Jeni это хорошо знает: fxsl.sf.net. FXSL - библиотека функционального программирования для XSLT существует уже более 8 лет. Он полностью написан на самом XSLT. Практически полностью реализует функции Haskell Prelude.

Dimitre Novatchev 08.04.2009 20:20

В XSLT 3.0, который поставляется с XPath 3.0 или 3.1, функции теперь являются первоклассными гражданами и могут передаваться как элементы, вызывать и т. д. Больше нет необходимости в расширениях.

Abel 05.01.2017 22:13

Вот такие ощущения, когда я программирую.

XSLT полностью основан на определении функций и применении их к выбранным событиям, которые поступают во входной поток.

XSLT позволяет вам установить переменную. Функциональное программирование не позволяет функциям иметь побочные эффекты - и это очень важно.

Тем не менее, при написании в XSLT возникает то же ощущение, что и работа в стиле FP. Вы работаете с вводом - вы не меняете его - для создания вывода.

Эта модель программирования очень сильно отличается от той, что использовалась при работе с DOM API. DOM вообще не разделяет ввод и вывод. Вам вручают структуру данных - и вы искажаете ее, как считаете нужным - без колебаний, ограничений или раскаяния.

Достаточно сказать, что если вам нравится FP и принципы, лежащие в основе этого, вы, вероятно, будете чувствовать себя комфортно в нем. Точно так же, как опыт программирования, управляемого событиями - и самого XML - также поможет вам освоить его.

Если ваш единственный опыт работы с нисходящими программами, не управляемыми событиями, тогда XSLT будет очень незнакомым, действительно чуждым ландшафтом. По крайней мере, сначала. Накопив немного опыта, а затем вернувшись к XSLT, когда выражения XPath и обработка событий действительно удобны для вас, окупятся щедро.

Да, XSL позволяет вам устанавливать переменную, но она неизменяема.

Camilo Martin 21.04.2012 18:53

Ты прав! Я поправляюсь по этому поводу. Спасибо, что обратили на это внимание. Установив значение переменной в XSLT, вы не сможете его изменить. Однажды я столкнулся с небольшой проблемой, когда забыл / не заметил этого.

JohnnySoftware 08.09.2012 00:05

Знаете, я думаю, им следовало сделать это более явным в самом языке, потому что я уверен, что вы и я не единственные, кто впал в это. <variable> заставляет меня думать о том, что меняется (во время выполнения) - <constant> был бы более точным. На самом деле, я помню, что мой опыт работы с XSLT был неудобным, особенно потому, что я ожидал, что он будет вести себя не так, как предполагалось, почти так же, как Java-программист почувствовал бы себя в первый раз, когда он / она использует Javascript.

Camilo Martin 08.09.2012 04:39

@CamiloMartin, он называется переменной, потому что он может варьироваться в зависимости от контекста выражения select или содержащего sequence constructor. Константа будет одинаковой во всей программе. Путаница здесь в том, что переменная не может быть переназначен в рамках той же области. Но его значение определенно Переменная, отсюда и название. Однако верно и обратное: XSLT не имеет понятия констант (это изменилось в XSLT 3.0).

Abel 04.01.2017 15:58

@Abel более 4 лет спустя, но я все еще нахожу XSLT ошеломляющим. Как будто кто-то сконструировал космический корабль, чтобы косить лужайку.

Camilo Martin 05.01.2017 21:42

@camilo, обычно требуется полдня с хорошим инструктором или интерактивным курсом, чтобы изучить основы, но без этого, учитывая необычный синтаксис, метод проб и ошибок может привести к большому разочарованию. Не уверен в аналогии с «космическим кораблем», я думаю, что это наоборот, xslt 1.0 был настолько ограничен, xslt 2.0 значительно улучшился, xslt 3.0 (с xpath 3.1) сделал его зрелым языком. То, что раньше было сложным в xslt, теперь стало проще, а выражения и конструкции стали намного чище.

Abel 05.01.2017 22:09

Кстати, мой аргумент о различных переменных в xslt: это не отличается в других функциональных языках от переменных или привязок let.

Abel 05.01.2017 22:15

Я уверен, что вы, ребята, уже нашли эту ссылку :-) http://fxsl.sourceforge.net/articles/FuncProg/Functional%20Programming.html.

Ну, функции в XSLT - это первоклассные граждане, и в конце концов есть некоторые обходные пути :-)

На самом деле это не аргумент, поскольку вы можете только объявлять переменные, но не изменять их значения после объявления. В этом смысле это декларативный, а не императивный стиль, как сказано в статье Новачева.

Функциональные языки программирования, такие как Scheme или Erlang, также позволяют объявлять переменные, и в Haskell вы также можете это сделать:

- функция test принимает переменную x и добавляет ее к каждому элементу списка xs

test :: [Int] -> [Int]
test xs = map (+ x) xs
where x = 2

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