XSLT からの脱却

2003 年 9 月 20 日

このサイトはすべてシンプルな XML ドキュメントで作成され、HTML に変換されます。これは非常にうまく機能し、HTML フォーマットを扱う必要がなくなります。(私のスタイルは派手なレイアウトではありません。お分かりのとおりです) この方法で 本全体を書いた ことさえあります。

この時間のほとんどで、変換言語として XSLT を使用しました。私は XSLT を振り回し、自分の思い通りにすることにかなり長けています。

しかし、もう終わりです。

この Bliki のソフトウェアを書いたとき (長いフライト中)、私は Ruby で書きました。それ以前は、Ruby を使用してホームページの新しいバージョンを作成しました。この演習からの私の結論は、XML 変換に Ruby を使用することが XSLT を使用することよりもはるかに簡単であるということでした。

  • XML は、プログラミング言語の構文として不十分です。そこにはあまりにも多くのノイズがあり、結果としてプログラムを見ることができません。
  • XSLT は、サブルーチンを呼び出すことを非常に面倒なものにするため、サブルーチンを使用することが真剣に阻害され、重複コードが奨励されます。
  • XSLT は単純なタスクを適切に処理しますが、より複雑なことになるとバロックになります。実際、不可能なものもあり、他の言語に飛び込まなければならないものもあります。
  • Ruby は、明瞭な構文を持ち、素晴らしい XML ライブラリを備えたクリーンな OO 言語を提供します。(Python も同様に優れている可能性が高く、私は試していません)。
  • テンプレートスタイルコードとトランスフォーマーのスタイルコードを組み合わせることができます。

XSLT の設計は、プログラムの使用方法に影響します。私の基本的な変換タスクは、XSLT の apply-template コマンドと同様に再帰的な apply 関数を使用して処理されます。この場合、私は ruby のリフレクションを使用して適切に機能させます。トランスフォーマーのポイントは次のとおりです。

class ElementHandler

  def apply anElement
    anElement.each {|e| handle(e)} if anElement
  end

  def handle aNode
    if aNode.kind_of? REXML::Text
      handleTextNode(aNode) 
    elsif aNode.kind_of? REXML::Element
      handle_element aNode  
    else
      return #ignore comments and processing instructions
    end
  end
  def handle_element anElement
    handler_method = "handle_" + anElement.name.tr("-","_")
    if self.respond_to? handler_method
      self.send(handler_method, anElement)
    else
      default_handler(anElement)  
    end
  end
...

基本的に、handle_element メソッドはリフレクションを使用して、ハンドラーオブジェクト内で適切に名前が付けられた関数を呼び出します。特定の種類のページの ElementHandler をサブクラス化します。そのため、特定のページに表示される質問には質問タグがあります。これについては、短い変換ルーチンを作成します。

  def handle_question anElement
    @html.p {@html.element('b'){apply anElement}}
  end

@html.element メソッドは、出力に b タグを出力します。これらの b タグ内には、ブロックコード {apply anElement}を実行した結果が含まれており、再帰が継続します。ここで、ruby のブロックが非常に役立ちます。

これには改善する方法は数多くあると思いますが、bliki を公開して以来、コードをほとんど触る必要はありませんでした。XSLTよりも処理がはるかに簡単であることがわかりました。

これは XSLT についてのいくつかの本当の疑問を提起する可能性があると思います。XSLT のパワーについてはまだ好きなことがたくさんありますが、構文と何度も行き当たる壁が嫌いです。私は明日のうちに私のサイト全体を Ruby に変換するつもりはありません - ほとんどの XSLT は正常に機能します - しかし、いつかそうする方法は確かに見えています。しかし、より大きな問題は、このようなタスクには XSLT よりもスクリプト言語の方が優れているかどうかです。