有人知道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的IDE,例如它显示{author}
,但扩展为:
<xsl:value-of select="author" />
当你点击它?
您应该问:如何DSL XSLT?
您可能对一些实际示例感兴趣,例如基于YML概念的YSLT。
注意最好不要转换/预处理代码以获得XSLT转换;相反,只需模拟处理器解析输入文档的方式并使用您自己的DSL。
您还可以编写自己的DSL。您应该使用一些真正使DSL概念变得简单的脚本语言,例如ruby。在ruby中,您可以实现一些非常漂亮和干净的东西,如:
match "/" do
value-of :foo
end
可以作为:
<xsl:template match="/">
<xsl:value-of select="foo"/>
</xsl:template>
另一个值得一提的是模板语言,比如erb。我认为这是一般情况下唯一可行的XSLT替代方案(即使这里的替代方案是一个很大的妥协,而且您很快就会对节点的过程性操作感到困惑)。
注意
我喜欢XSLT的冗长性,而且,由于这种冗长性,我认为XSLT代码比任何其他语言(一旦您了解模板是如何工作的)都更具可读性。
我不建议搜索将一些不同的标记转换为XSLT代码的内容。最终的XSLT代码将失去可读性,其代码将根本不是最优的。
这些年来,我看到过一些这样做的尝试,但除了它的创始人之外,似乎没有人使用过。坦率地说,我认为XSLT的冗长是您很快就会习惯的。XSLT 2.0当然比1.0简单得多。
在上周的Balisage会议上,Evan Lenz提出了另一种尝试,称为Carrot:这一次不仅是XSLT的紧凑语法,而且是一种试图提供XSLT和XQuery联合的语言。看起来很有趣,但我认为还没有实现(如果它流行起来我会很惊讶…)
处理指令可以用来实现宏,比如在这个与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或xml也可能是您感兴趣的。