Синтаксический сахар для XSLT

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

Для отладки можно использовать xslsugar.xslt прямо в вашем проекте, но перед тем как выложить в рабочий проект, лучше всего преобразовать приправленные шаблоны в обычный XSLT, и использовать уже их. Для этого можно воспользоваться следующим скриптом:

#!/bin/sh
cp $1 $1.bak
xsltproc -o $1 xslsugar.xslt $1

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

Пример использования

<p xsl:each="item" xsl:if-attr="position() mod 2" xsl:attr-class="'odd'">
  <span class="date" xsl:value="date"/>
  <xsl:value-of select="title"/>
  <xsl:block xsl:if="description" xsl:value="concat(' ', description)" xsl:doe="yes"/>
</p>

Такой код будет преобразован в следующий:

<xsl:for-each select="item">
  <p>
    <xsl:if test="position() mod 2">
      <xsl:attribute name="class"><xsl:value-of select="'odd'"/></xsl:attribute>
    </xsl:if>
    <span class="date"><xsl:value-of select="date"/></span>
    <xsl:value-of select="title"/>
    <xsl:if test="description">
        <xsl:value-of select="concat(' ', description)" disable-output-escaping="yes"/>
    </xsl:if>
  </p>
</xsl:for-each>

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

Есть некоторые ограничения на совместное использование атрибутов в одном узле, следующие атрибуты нельзя использовать вместе: xsl:each, xsl:if, xsl:choose, xsl:when, xsl:other.

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

Список дополнительных узлов и атрибутов

<xsl:block/> группировка других тегов, не выводится

<node xsl:val="val"/>, <node xsl:value="val"/>, <node xsl:value-of="val"/> Выводит <xsl:value-of>: <node><xsl:value-of select="val" disable-output-escaping="yes"/></node> При использовании атрибута xsl:doe="yes" выводит disable-output-escaping="yes".

<xsl:apply>, <node xsl:apply="sel" xsl:mode="mode">, <node xsl:apply-templates="sel"> Выводит <xsl:apply-templates> <node><xsl:apply-templates select="sel" mode="mode"/></node>

<xsl:call/>, <node xsl:call="name">, <node xsl:call-template="name"> Выводит <xsl:call-template> <node><xsl:call-template name="name"/></node>

<node xsl:text="Text"> Выводит текст <node>Text</node> При использовании атрибута xsl:doe="yes" выводит <xsl:text disable-output-escaping="yes">.

<node xsl:if="check">, <node xsl:test="check"> Вывод узла при условии <xsl:if test="check"> <xsl:if test="check"><node/></xsl:if>

<node xsl:for="item">, <node xsl:each="item">, <node xsl:for-each="item">, <xsl:for>, <xsl:each> Вывод узла в цикле <xsl:for-each select="item"> <xsl:for-each select="item"><node/></xsl:for-each>

<node xsl:if-attr="check" xsl:attr-class="odd"> Размещение атрибутов по условию, название атрибута берется из имени xsl:attr-name <node><xsl:if test="check"><xsl:attribute name="class">odd</xsl:attribute></xsl:if></node>

<node xsl:choose="">...</node> Вставляет внутрь выборку xsl:choose <node><xsl:choose>...</xsl:choose></node>

<node xsl:when="check"> Выполнение при xsl:when <xsl:when test="check"><node/></xsl:when>

<node xsl:other=""> Выполнение при xsl:otherwise <xsl:otherwise><node/></xsl:otherwise>

<node xsl:comment="text"> Вставляет комментарий <node><xsl:comment>text</xsl:comment>

<xsl:pi name="name"> Сокращенная запись xsl:processing-instruction <xsl:processing-instruction name="name">

<xsl:attr name="name"> Сокращенная запись xsl:attribute <xsl:attribute name="name">

<xsl:with name="name"> Сокращенная запись xsl:with-param <xsl:with-param name="name">

Ссылки

Статья на habrahabr.ru

Исходный код на code.google.com

04 мая 2012