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を作成することもできます。たとえば、rubyのように、DSLの概念を本当に簡単にするスクリプト言語を使用する必要があります。ルビーでは、次のような非常に素晴らしくクリーンなものを実現できます。

match "/" do
 value-of :foo
end

これは次のように機能します:

<xsl:template match="/">
 <xsl:value-of select="foo"/>
</xsl:template>

言及する価値のあるもう1つのことは、erbのような言語のテンプレートです。これは、一般的にXSLTの唯一の実行可能な代替案だと思います(ここでの代替案が大きな妥協点であり、ノードの手続き的な操作ですぐに迷子になったとしても)。


ノート

私はXSLTの冗長性が大好きです。この冗長性のために、XSLTコードは他のどの言語よりもはるかに読みやすいと思います(テンプレートの動作を理解すれば)。

いくつかの異なるマークアップをXSLTコードに変換するために何かを検索することはお勧めしません。最終的なXSLTコードは読みにくくなり、そのコードはまったく最適ではなくなります。

于 2011-07-26T12:00:35.047 に答える
1

私は何年にもわたってこれを行うためのいくつかの試みを見てきましたが、その創始者以外の誰かによって使用されたように見えるものはありません。率直に言って、XSLTの冗長性はすぐに慣れるものだと思います。もちろん、XSLT2.0は1.0よりもはるかに冗長ではありません。

于 2011-07-26T01:38:54.570 に答える
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>

簡略化されたパラメータの受け渡しをカバーする同様の質問もあります。

XMLPreprocessまたはoXMLも興味深い場合があります。

于 2012-11-14T16:38:03.157 に答える