寻找(伪)XSLT预处理器/模板,使其更简洁

时间:2011-07-25 13:21:44

标签: xslt ide preprocessor template-engine verbose

有没有人知道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" />

点击它时?

4 个答案:

答案 0 :(得分:2)

您应该更好地问:如何 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>

值得一提的另一件事是模板语言,如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,它涵盖了简化的参数传递。

XMLPreprocessoXML也可能会引起关注。