Две концепции из XSLT на других языках: apply-templates и xpath

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

  • возможность перемещаться по структурам данных с использованием статов в стиле «путь» через xpath
  • возможность проходить преобразования шаблонов с использованием шаблонов приложений вместо итеративного или «циклического» подхода.

Согласно Google, есть несколько попыток добавить поддержку "xpath-style" в Javascript, но они, по-видимому, не очень популярны. Пока я не нашел ничего, где кто-то использовал бы подход "применить шаблоны" на другом языке.

Вопрос: Кто-нибудь знает язык программирования (надеюсь, что это основной поток), который крадет эти две хорошие идеи из XSLT или применяет те же или похожие концепции, используя другой метод?


person dreftymac    schedule 17.07.2009    source источник
comment
Согласно спецификации, XSLT не предназначен в качестве языка программирования общего назначения (например, вы не можете выполнять преобразования XSLT в JSON), поэтому, даже если бы XSLT был идеальным для меня, он все равно был бы только ограниченным использованием, поскольку XML - не единственный мой формат данных. .   -  person dreftymac    schedule 18.07.2009
comment
Посмотрите json2xml: goessner.net/download/prj/jsonxml, упомянутый здесь: xml.com/pub/a/2006 /05/31/converting-between-xml-and-json.html   -  person Mads Hansen    schedule 19.08.2009


Ответы (5)


возможность перемещаться по структурам данных с использованием статов в стиле «путь» через xpath

Мне неизвестен какой-либо другой язык, в который встроен XPath, но LINQ to XML в чем-то похож, особенно в его синтаксический сахар в VB воплощение. Однако вы можете реализовать это в макросах Common Lisp или D-шаблонах.

возможность проходить преобразования шаблонов с использованием шаблонов приложений вместо итеративного или «циклического» подхода.

Я не знаю основных языков. Действительно, эта функция, вероятно, является основной причиной использования XSLT (а не, например, XQuery, если посмотреть на тесно связанные языки).

Это эффективно расширяемая динамическая отправка на приемник в произвольных условиях - как таковая, я думаю, вы, вероятно, могли бы сделать это в Common Lisp (CLOS, если быть конкретным) - если я правильно помню, его мультиметоды могут соответствовать произвольным условиям, поэтому, если у вас есть XPath оценщика шаблонов, вы можете использовать его для эмуляции apply-templates и даже больше, поскольку apply-templates отправляет только один аргумент, в то время как мультиметоды CLOS отправляют несколько аргументов.

person Pavel Minaev    schedule 17.07.2009

XPath, хотя и необходим для работы XSLT, не зависит от него; библиотеки, такие как libxml, предоставляют его бесплатно. Стиль описываемого вами шаблона приложения немного сложнее; это то, для чего вы обычно используете XSLT.

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

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

person Edward Z. Yang    schedule 17.07.2009

Для XPath определенно. Для C существует Xalan-C ++, для Java javax.xml.xpath (с несколькими реализации), а в C # есть XPathNavigator и SelectNodes. Если вы хотите использовать XPath для иерархий объектов, посмотрите JXPath.

Для преобразований шаблонов вам следует обратиться к LINQ C #, если у вас нет уже нет. Это не совсем то же самое, но позволяет обрабатывать объекты без явного цикла.

person Matthew Flaschen    schedule 17.07.2009

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

person PetervanBoheemen    schedule 17.07.2009
comment
Цель состоит не в преобразовании XML, а в преобразовании произвольных структур данных (например, JSON) с использованием любого языка программирования общего назначения (вместо языка общего назначения, такого как XSLT). - person dreftymac; 18.07.2009
comment
В XSLT 2.0 появилось множество новых функций, которые упрощают анализ файлов, отличных от XML, таких как JSON (например, unparsed-text (), регулярные выражения и т. Д.). Вместо того, чтобы искать альтернативу XSLT, посмотрите, сможете ли вы выполнить то, что вам нужно, с помощью XSLT 2.0. - person Mads Hansen; 19.08.2009

Комментарий к вашему первому требованию:

  • возможность перемещаться по структурам данных с использованием статов в стиле «путь» через xpath

XPath делает много предположений о структуре данных. Если вы собираетесь его использовать, вы можете также преобразовать свою структуру в XML, потому что она будет выглядеть так же, как только вы сделаете ее доступной для прохождения через какой-нибудь XPath-подобный язык, если вы не ограничите строго подмножество XPath.

Также имейте в виду, что «только две вещи», которых вам не хватает, XPath и обработка шаблонов, на самом деле являются огромной частью того, что составляет Xslt. Мне любопытно, почему вы решили снять его с пояса с инструментами.

Несмотря на то, что вам нужна альтернатива Xslt, я все же рекомендую Xslt и Xslt 2.0, в частности. С добавлением unparsed-text и analysis-string у вас есть мощный язык обработки текста. Например, взгляните на CSV в таблицу стилей XML. Несмотря на то, что JSON не является обычным, вы все равно сможете написать простой переводчик JSON в XML, используя рекурсивные шаблоны, и преобразовать результат по желанию.

person Chris Scott    schedule 20.07.2009
comment
Спасибо за ваш комментарий. Вы уже затронули одну проблему: преобразование каждой структуры в пакет данных XML имеет довольно громоздкие аспекты. Более того, XSLT отлично подходит для того, что он делает, но есть что сказать и о языке преобразований общего назначения. Неясно, позиционирует ли себя XSLT 2.0 как таковой. Если так, то результат еще предстоит увидеть. - person dreftymac; 20.07.2009
comment
Я почти уверен, что большинство согласится с тем, что XSLT не является чем-то универсальным. Однако мне любопытно, имел ли вы в виду конкретный вариант использования псевдокода. Если бы было что-то универсальное, как бы вы определили его структуру и как передать ее на трансформатор? Я бы предположил, что определение будет достаточно громоздким, чтобы оправдать преобразование ваших структур данных в XML. Однако если вы имели в виду довольно элегантный синтаксис, это было бы отличной идеей для проекта. - person Chris Scott; 20.07.2009
comment
Если вы можете сравнить JSON с XML, есть некоторые сходства. Оба используются для указания произвольных структур с потенциально множеством уровней вложенности. Кроме того, ранее упоминалась адресация JSON в стиле xpath (см., Например, goessner.net/articles/JsonPath) - person dreftymac; 21.07.2009