4

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

当你点击它?

4

4 回答 4

2

你最好问一下:如何对XSLT进行DSL化?

您可能对一些实际示例感兴趣,例如基于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 代码将失去可读性,并且它的代码根本不是最优的。

于 2011-07-26T12:00:35.047 回答
1

上周在 Balisage 上,Evan Lenz 提出了另一种尝试,称为 Carrot:这一次不仅仅是 XSLT 的紧凑语法,而是一种尝试提供 XSLT 和 XQuery 联合的语言。看起来很有趣,但我认为还没有实现(如果它流行起来我会感到惊讶......)

于 2011-08-07T22:11:00.930 回答
1

处理指令可用于实现宏,例如在 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>

还有一个类似的问题涵盖了简化的参数传递。

XMLPreprocessoXML也可能很有趣。

于 2012-11-14T16:38:03.157 回答
1

多年来,我已经看到了一些尝试这样做,但似乎除了其创始人之外的任何人都没有使用过。坦率地说,我认为 XSLT 的冗长是你很快就会习惯的。XSLT 2.0 当然远没有 1.0 冗长。

于 2011-07-26T01:38:54.570 回答