有没有人知道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形式的乘法,但我相信你已经弄明白了我的意思。
或者是否有一个比其他人更了解XSLT的IDE,例如它显示{author}
但扩展为:
<xsl:value-of select="author" />
点击它时?
答案 0 :(得分:2)
您应该更好地问:如何 DSL XSLT?
注意最好不要转换/预处理代码以获得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代码可读性低,其代码根本不是最佳。
答案 1 :(得分:1)
多年来,我已经看到过这样做的一些尝试,但似乎除了它的创始人以外的任何人都没有使用过。我认为,坦率地说,XSLT的冗长是您很快习惯的。 XSLT 2.0当然远不如1.0。
答案 2 :(得分:1)
上周在Balisage上,Evan Lenz再次展示了一种名为Carrot的尝试:这次不仅仅是XSLT的紧凑语法,而是一种试图提供XSLT和XQuery联合的语言。看起来很有趣,但我认为还没有实现(如果它能够抓住我会感到惊讶......)
答案 3 :(得分:1)
处理说明可用于实现宏,例如在Docbook上的unrelated question中。
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>
还有一个similar question,它涵盖了简化的参数传递。
XMLPreprocess或oXML也可能会引起关注。