test - xslt editor
Buscando un(pseudo) XSLT preprocesador/templater para hacerlo menos detallado (4)
¿Alguien sabe de un preprocesador para XSLT para hacerlo menos detallado? Algo así como lo que SASS es para CSS, un pequeño programa que tendrá una sintaxis ligera:
"/":
{
<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
}
}
y conviértalo en XSLT mucho menos legible:
<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>
Soy demasiado perezoso para escribir la forma XSLT de multiplicar, pero estoy seguro de que ya descubrió lo que quiero decir.
¿O hay un IDE que sea más consciente de XSLT que otros, por ejemplo, muestra {author}
pero se expande a:
<xsl:value-of select="author" />
cuando haces clic en él?
He visto algunos intentos de hacer esto a lo largo de los años, pero ninguno parece haber sido usado por nadie más que por su creador. Creo que, francamente, la verbosidad de XSLT es algo a lo que te acostumbras rápidamente. XSLT 2.0 es, por supuesto, mucho menos detallado que 1.0.
Debería ser mejor preguntar: ¿cómo DSL el XSLT?
Puede que le interese algún ejemplo práctico como YSLT basado en el concepto YML .
NOTA: debería ser mejor no convertir / preprocesar el código para obtener una transformación XSLT; en su lugar, simplemente emula la forma en que un procesador analiza el documento de entrada y utiliza tu propia DSL.
También puedes escribir tu propia DSL. Debería usar algún lenguaje de scripting que realmente haga que el concepto de DSL sea fácil, como, por ejemplo, ruby . En ruby , puedes lograr algo muy bonito y limpio como:
match "/" do
value-of :foo
end
que podría funcionar como:
<xsl:template match="/">
<xsl:value-of select="foo"/>
</xsl:template>
Otra cosa que vale la pena mencionar es la creación de plantillas de lenguajes como erb . Esta es la única alternativa viable para XSLT en general (incluso si la alternativa aquí es un gran compromiso y te pierdes muy pronto con la manipulación de nodos).
Nota
Me encanta la verbosidad XSLT y, debido a esta verborrea, creo que el código XSLT es mucho más legible que cualquier otro idioma (una vez que comprenda cómo funcionan las plantillas).
No recomiendo buscar algo para convertir un marcado diferente al código XSLT. Su código XSLT final perderá su capacidad de lectura y su código no será óptimo en absoluto.
En Balisage, la semana pasada, Evan Lenz presentó otro intento, llamado Zanahoria: esta vez no solo una sintaxis compacta para XSLT sino un lenguaje que intenta proporcionar la unión de XSLT y XQuery. Parece interesante, pero no creo que haya una implementación todavía (y me sorprendería si se da cuenta ...)
Las instrucciones de procesamiento se pueden usar para implementar macros, como en esta pregunta no relacionada en 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>
También hay una pregunta similar que cubre el paso de parámetros simplificado.
XMLPreprocess o oXML también pueden ser de interés también.