Ищу (псевдо) препроцессор/шаблон XSLT, чтобы сделать его менее подробным

Кто-нибудь знает препроцессор для XSLT, чтобы сделать его менее подробным? Что-то вроде того, чем SASS является для CSS, немного проги, которая использует легкий синтаксис:

"/":
{
 <html>
  <head>
  <title>My book collection</title>
  </head>
  <body>
  {@ "//media"}
  {@ quantity = calc_abs_value("//total_quantity")}
  Price : {@ multiply(price:"//item[@selected='true'][@price]",qty  :$quantity) }
  </body>  
 </html>
}

"media[@type='book']":
{
 <div id="{@id}">
 {title} by {author} published in {published_date}
 </div>
}

function calc_abs_value(value)
{
 if ($value < 0) {- $value} else {$value}
}

function multiply(price,qty:"1")
{
 switch 
 {
  "$qty = 1" : $price * $qty 
  "$qty < 5" : $price * $qty * 0.95 
  "$price * $qty < 0" : 0
  default : 0
 }
}

и превратим это в гораздо менее читаемый XSLT:

    <xsl:template match="/">
     <html>
      <head>
      <title>My book collection</title>
      </head>
      <body>
      <xsl:apply-templates select="//media" />
      <xsl:variable name="quantity"><xsl:call-template name="calc_abs_value">
      <xsl:with-param name="value"><xsl:value-of select="//total_quantity" /></xsl:with-param>
      </xsl:call-template></xsl:variable>
      Price : <xsl:call-template name="multiply">
      <xsl:with-param name="price"><xsl:value-of select="//item[@selected='true'][@price]" /></xsl:with-param>
      <xsl:with-param name="qty"><xsl:value-of select="$quantity" /></xsl:with-param>
      </xsl:call-template>
      </body>  
     </html>
    </xsl:template>


    <xsl:template match="media[@type='book']">
    {
     <div id="{@id}">
     <xsl:value-of select="title" /> by <xsl:value-of select="author" /> published in <xsl:value-of select="published_date" />
     </div>
    }
    </xsl:template>


    <xsl:template name="calc_abs_value">
    <xsl:param name="value" />
    <xsl:choose>
      <xsl:when test="$value < 0">
       - <xsl:value-of select="$value" />
      </xsl:when>
      <xsl:otherwise>
        <xsl:value-of select="$value" />
      </xsl:otherwise>
    </xsl:choose>
    </xsl:template>

Мне лень писать XSLT-форму умножения, но я уверен, что вы уже поняли, что я имею в виду.

Или есть IDE, которая более осведомлена о XSLT, чем другие, например, она отображает {author}, но расширяется до:

<xsl:value-of select="author" />

когда нажимаешь?


person frenchone    schedule 25.07.2011    source источник


Ответы (4)


Вам лучше спросить: как DSL XSLT?

Вас может заинтересовать практический пример, например YSLT на основе YML.

ПРИМЕЧАНИЕ Лучше вообще не преобразовывать/предварительно обрабатывать код для получения XSLT-преобразования; вместо этого просто эмулируйте способ, которым процессор анализирует входной документ, и используйте свой собственный DSL.


Вы также можете написать свой собственный DSL. Вы должны использовать какой-нибудь язык сценариев, который действительно упрощает концепцию DSL, например, ruby. В ruby вы можете добиться чего-то очень красивого и чистого, например:

match "/" do
 value-of :foo
end

который может работать как:

<xsl:template match="/">
 <xsl:value-of select="foo"/>
</xsl:template>

Также стоит упомянуть языки шаблонов, такие как эрб. Это, я думаю, единственная возможная альтернатива XSLT в целом (даже если альтернатива здесь — большой компромисс, и вы очень скоро потеряетесь в процедурных манипуляциях с узлами).


Примечание

Мне нравится многословие XSLT, и из-за этого многословия я думаю, что код XSLT гораздо читабельнее, чем любой другой язык (если вы понимаете, как шаблоны Работа).

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

person Emiliano Poggi    schedule 26.07.2011
comment
Выглядит многообещающе, посмотрю. Многословность не делает язык более читабельным, а просто делает его менее двусмысленным. Я уже произвожу неоптимальный код без DSL :), так что это не имеет большого значения. - person frenchone; 27.07.2011
comment
Взглянув на программу, вы (я) можете угадать логику (циклы, настройки переменных). Я не могу сделать это с помощью xsl: мои глаза/мозг не могут интегрировать столько текста. Возможно, это просто вопрос практики или отсутствия хорошей IDE с хорошей подсветкой синтаксиса. Но я подозреваю, что это немного похоже на длинные фразы: они могут быть более понятными, когда вы их внимательно читаете, но после некоторых у вас начинает болеть голова. - person frenchone; 27.07.2011
comment
Это не отсутствие хорошей IDE. Вам нужно только выделение и отступ. Я думаю, что ваши опасения во многом связаны с тем, что вы можете исходить из нефункционального языка программирования. В XSLT обычно избегают циклов или параметров var. - person Emiliano Poggi; 27.07.2011
comment
Вас также может заинтересовать язык шаблонов, такой как erb, как указано в отредактированном ответе. - person Emiliano Poggi; 27.07.2011

Я видел несколько попыток сделать это за эти годы, но ни одна из них, похоже, не использовалась кем-либо, кроме ее создателя. Честно говоря, я думаю, что к многословию XSLT быстро привыкаешь. XSLT 2.0, конечно, намного менее подробен, чем 1.0.

person Michael Kay    schedule 26.07.2011
comment
xslt2 не поддерживается .net AFAIK (позор вам, MS), так что мне это не подходит. Из-за этого я не рассматривал возможность его использования, несмотря на то, что он выглядит легче для чтения, чем xslt1 (быстро взглянул на него, когда самостоятельно изобретал мюнхенский язык). Меня беспокоит не столько отсутствие функциональности (exslt существует, и я не делаю сложный xslt), сколько отсутствие удобочитаемости. Я буду рад, если вы укажете мне на эти попытки - person frenchone; 26.07.2011
comment
Вот один: zanthan.com/ajm/xsltxt И еще один: code.google.com/p/compactxml И третий: wilmott.ca/rxslt/rxslt.html И я видел много других за эти годы. Они все мертвы, как дронты. - person Michael Kay; 29.07.2011

На прошлой неделе в Balisage Эван Ленц представил еще одну попытку под названием Carrot: на этот раз не просто компактный синтаксис для XSLT, но язык, который пытается обеспечить объединение XSLT и XQuery. Выглядит интересно, но я не думаю, что еще есть реализация (и я был бы удивлен, если бы она прижилась...)

person Michael Kay    schedule 07.08.2011
comment
Вау! Выглядит многообещающе. - person Emiliano Poggi; 08.08.2011

Инструкции по обработке можно использовать для реализации макросов, например, в этом несвязанном вопросе в Docbook.

Template:
<?echo gal?>

Code:
<xsl:variable name="gal" select="'howdy'"/>

<xsl:template match="processing-instruction('echo')">
  <xsl:value-of select="//xsl:variable/@select[../@name=current()]"/>
</xsl:template>

Также есть похожий вопрос, который охватывает упрощенную передачу параметров.

XMLPreprocess или oXML.

person Paul Sweatte    schedule 14.11.2012
comment
выглядит интересно. Придется исследовать дальше, действительно ли это улучшает читаемость (использование переменной немного неясно. Является ли она глобальной? локальной?). похоже, это поможет для встроенного контента: ‹?echo test?› понятнее, чем ‹call-template name=echo›‹xsl:with-param›test‹/..›‹/..›, но я не уверен об обработке директив в функции. - person frenchone; 20.11.2012