Элегантные примеры xslt? - PullRequest
4 голосов
/ 29 марта 2009

После длительного цикла обучения через XAML я вернулся к HTML и javascript и понял, что концепция декларативного кода - с точки зрения правил преобразования - является невероятно мощной концепцией.

Несмотря на избыток синтаксиса, обработка XML XSLT является краеугольным камнем программирования декларативных преобразований. Однако мне всегда было трудно понять, как XSLT будет использоваться для повседневных задач (с XML).

Какие хорошие примеры того, как XSLT элегантно решает проблему программирования, помимо генерации HTML?

Полагаю, это хорошо для преобразования графиков и обработки данных ...

Редактировать: я надеюсь на несколько реальных примеров - одна из вещей, которая меня полностью останавливает на xslt, это визуальная сложность кода.

Ответы [ 3 ]

4 голосов
/ 29 марта 2009

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

Примеры см. в этой статье в FXSL 2.0 - библиотека функционального программирования для XSLT 2.0.

В качестве языка FP XSLT также является декларативным языком . Это, помимо прочего, означает, что каждый заявляет, указывает существующие отношения.

Такое определению часто не требует никакого дополнительного кода для получения результата - оно само является собственной реализацией, или определением исполняемого файла или спецификацией исполняемого файла .

Вот небольшой пример .

Это выражение XPath 2.0 определяет" Максимум Главный фактор натурального числа ":

if(f:isPrime($pNum))
  then $pNum
  else
    for $vEnd in xs:integer(floor(f:sqrt($pNum, 0.1E0))),
        $vDiv1 in (2 to $vEnd)[$pNum mod . = 0][1],
        $vDiv2 in $pNum idiv $vDiv1
      return
        max((f:maxPrimeFactor($vDiv1),f:maxPrimeFactor($vDiv2)))

Чтобы произнести это по-английски , максимальный простой множитель числа pNum является самим числом, если pNum является простым, в противном случае если vDiv1 и vDiv2 являются двумя факторами pNum, то максимальный простой коэффициент pNum равен большее из максимальных простых множителей: vDiv1 и vDiv2.

Как мы используем это для фактического расчета Максимального простого множителя в XSLT? Мы просто обернем определение выше в <xsl:function> и ... получим результат!

 <xsl:function name="f:maxPrimeFactor" as="xs:integer">
  <xsl:param name="pNum" as="xs:integer"/>

  <xsl:sequence select=
   "if(f:isPrime($pNum))
      then $pNum
      else
        for $vEnd in xs:integer(floor(f:sqrt($pNum, 0.1E0))),
            $vDiv1 in (2 to $vEnd)[$pNum mod . = 0][1],
            $vDiv2 in $pNum idiv $vDiv1
          return
            max((f:maxPrimeFactor($vDiv1),f:maxPrimeFactor($vDiv2)))
   "/>
 </xsl:function>

Затем можно вычислить MPF для любого натурального числа , например:

f:maxPrimeFactor(600851475143) = 6857

Что касается эффективности, ну, это преобразование занимает всего 0,109 сек .

Другие примеры элегантного и эффективного кода XSLT :

2 голосов
/ 29 марта 2009

Как насчет генерации кода? Я использую это в protobuf-net для создания файлов .cs из модели .proto (экспортируется как xml) - , как и . В .NET 4.0 шаблоны T4 были бы более очевидным выбором, но до этого механизм T4 не был автономным (AFAIK).

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

0 голосов
/ 29 марта 2009

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

Было запрошено, чтобы они могли сохранить его в виде файла HTML с красивым аккуратным видом или в формате XML, чтобы они могли обрабатывать его дальше, как им хотелось.

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

Это не идеально (если они перемещают HTML куда-либо без XSL, IE отказывается отображать его вообще!), Но если мы меняем планы, я могу просто изменить продукт, чтобы он позволял пользователю выбирать формат, и если они выбирают HTML, все, что мне нужно сделать, это запустить XSLT для XML, чтобы получить HTML, прежде чем я его сохраню.

В идеале был бы способ создать отдельный HTML-файл, содержащий XML и XSLT, но я не знаю ни одного ... который сам по себе является вопросом.

...