Ищу (псевдо) препроцессор/Templater (псевдо), чтобы сделать его менее многословным [закрыто
-
25-10-2019 - |
Вопрос
Кто -нибудь знает о препроцессоре для XSLT, чтобы сделать его менее словесным? Что -то вроде что Нахем для 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" />
Когда вы нажимаете на него?
Решение
Вам лучше спросить: как DSL XSLT?
Вас может быть заинтересован в каком -то практическом примере, таким как Yslt на основе Yml концепция.
ПРИМЕЧАНИЕ Должно быть лучше не преобразовать/предварительно обрабатывать код, чтобы вообще получить преобразование XSLT; Вместо этого просто подражайте тому, как процессор анализирует входной документ и используйте свой собственный DSL.
Вы также можете написать свой собственный DSL. Вы должны использовать какой -то язык сценариев, который действительно облегчает концепцию DSL, как, например,, например, Рубин. Анкет В Рубин, вы можете достичь чего -то очень красивого и чистого, как:
match "/" do
value-of :foo
end
который может работать как:
<xsl:template match="/">
<xsl:value-of select="foo"/>
</xsl:template>
Еще одна вещь, о которой стоит упомянуть шаблон языков как эрб. Анкет Это я думаю, что единственная возможная альтернатива XSLT в целом (даже если альтернатива здесь - большой компромисс, и вы очень скоро потерялись с процедурными манипуляциями с узлами).
Примечание
Я люблю условности xslt И из -за этой условности я думаю, что код XSLT гораздо более читаемо тогда любой другой язык (как только вы поймете, как работают шаблоны).
я не Рекомендую искать что -нибудь для преобразования другой разметки в код XSLT. Ваш последний код XSLT будет свободный отклонность и его код не будет оптимальным вообще.
Другие советы
Я видел несколько попыток сделать это за эти годы, но ни один из них, кажется, не использовался кем -либо, кроме его создателя. Я думаю, что, честно говоря, условности XSLT - это то, к чему вы быстро привыкаете. XSLT 2.0, конечно, гораздо менее словес, чем 1,0.
В Balisage на прошлой неделе Эван Ленц представил еще одну попытку, называемую Морковью: на этот раз не просто компактный синтаксис для XSLT, но и язык, который пытается обеспечить союз XSLT и Xquery. Выглядит интересно, но я не думаю, что есть реализация (и я был бы удивлен, если она займет ...)
Обработка-инструктики могут использоваться для реализации макросов, таких как в этом несвязанный вопрос на докбуке.
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 Также может быть интересен.