antでXTを使う−Sweet Ant Tools

使用環境

使用する各種ソフトは以下の通りである.必須なのはXT・ant・Sweet Ant Toolsの三つ.cygwinではなく,DOSコマンドプロンプトでも実行可能だが,慣れているのでcygwinを使用する.XT・ant・Sweet Ant Toolsのインストールは説明するが,Windows2000・cygwinのインストールの説明は割愛する.

XMLとXSLTの記述

まず,テスト用に使うファイルを作成する.sam.xmlをsam.xslでxhtml形式に変換する.文字コードはutf-8である.

<!-- sam.xml -->
<?xml version="1.0" encoding="utf-8"?>
<root>
  <h1>今日の天気</h1>
  <p>
    今日はいい天気です.
  </p>
</root>

<!-- sam.xsl -->
<?xml version="1.0" encoding="utf-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
  <xsl:output
    method="xml"
    encoding="utf-8"
    indent="yes"
    doctype-public="-//W3C//DTD XHTML 1.1//EN"
    doctype-system="http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd"/>

  <xsl:template match="/root">
    <html xml:lang="ja" xmlns="http://www.w3.org/1999/xhtml">
      <head>
        <title><xsl:value-of select="/root/h1"/></title>
      </head>
      <body>
        <xsl:apply-templates/>
      </body>
    </html>
  </xsl:template>

  <xsl:template match="h1">
    <xsl:copy-of select="."/>
  </xsl:template>

  <xsl:template match="p">
    <p>
      <xsl:apply-templates/>
    </p>
  </xsl:template>
</xsl:stylesheet>

XTインストール

zipファイルを展開して適当なディレクトリに配置する.今回は,c:\Program Files\xtに配置した.以下のコマンドを動かして動作を確認する.カレントディレクトリにsam.htmlができるはずである.

$ java -cp "${PROGRAMFILES}/xt/xt.jar;${PROGRAMFILES}/xt/lib/xp.jar;." com.jclark.xsl.sax.Driver sam.xml sam.xsl sam.html

<!-- sam.html -->
<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
<html xml:lang="ja" xmlns="http://www.w3.org/1999/xhtml">
<head>
  <title>今日の天気</title>
</head>
<body>
  <h1>今日の天気</h1>
  <p>
    今日はいい天気です.
  </p>
</body>
</html>

antインストール

zipファイルを展開して適当なディレクトリに配置する.今回は,c:\Program Files\antに配置した.サブディレクトリdoc以下にあるドキュメントを参考に,環境変数ANT_HOMEJAVA_HOMEPATHを設定する.cygwinでbashを使っているので,~/.bashrcに以下の記述を追加した.今回は,antのあるディレクトリにPATHを設定するのではなく,aliasを定義している.好みの問題だ.

# .bashrcへ追加
export JAVA_HOME='/cygdrive/c/Progra~1/j2se'
export ANT_HOME='/cygdrive/c/Progra~1/ant'
alias ant=${ANT_HOME}/bin/ant

antを起動すると以下のエラーが発生する場合がある.

$ ant
Exception in thread "main" java.lang.NoClassDefFoundError: and

空白のあるパス(Documents and SettingsProgram Files)が原因である.${ANT_HOME}/bin/antはシェルスクリプトなので,これを修正する.180~184行目を以下のように書換える.

修正前:
  # For Cygwin, switch paths to Windows format before running java
  if $cygwin; then
    ANT_HOME=`cygpath --path --windows "$ANT_HOME"`
    JAVA_HOME=`cygpath --path --windows "$JAVA_HOME"`
    CLASSPATH=`cygpath --path --windows "$CLASSPATH"`
    LOCALCLASSPATH=`cygpath --path --windows "$LOCALCLASSPATH"`
    ANT_OPTS="$ANT_OPTS -Dcygwin.user.home="`cygpath --path --windows "$HOME"`
  fi

  "$JAVACMD" -classpath "$LOCALCLASSPATH" -Dant.home="${ANT_HOME}" $ANT_OPTS org.apache.tools.ant.Main $ANT_ARGS "$@"

修正後:
  # For Cygwin, switch paths to Windows format before running java
  if $cygwin; then
    ANT_HOME=`cygpath --path --dos "$ANT_HOME"` # --windowsを--dosに修正
    JAVA_HOME=`cygpath --path --dos "$JAVA_HOME"` # --windowsを--dosに修正
    CLASSPATH=`cygpath --path --dos "$CLASSPATH"` # --windowsを--dosに修正
    LOCALCLASSPATH=`cygpath --path --dos "$LOCALCLASSPATH"` # --windowsを--dosに修正
    ANT_OPTS="$ANT_OPTS -Dcygwin.user.home="`cygpath --path --dos "$HOME"` # --windowsを--dosに修正
  fi

  "$JAVACMD" -classpath "$LOCALCLASSPATH" -Dant.home="${ANT_HOME}" $ANT_OPTS org.apache.tools.ant.Main $ANT_ARGS "$@"

antのタスクstyleを使えば,XMLとXSLTを使うことができる.パラメタprocessorにxsltプロセッサを指定できるが,このパラメタに指定できるのはxslp(XSL:P)またはxalan(Xalan)のみである.XTを使うためには後述するSweet Ant Toolsを使用する.

Sweet Ant Toolsインストール

zipファイルを展開して適当なディレクトリに配置する.今回は,c:\Program Files\satに配置した.サブディレクトリdoc以下にあるドキュメント(sat.en.html)を見ると,サブディレクトリlib以下のファイルを${ANT_HOME}/libディレクトリにコピーすることになっている.lib/xt.jarはXTのようだが,今回インストールした方が新しいので,これは使わない.ファイルをコピーするのではなく,シンボリックリンクを作成した.

$ cd /cygdrive/c/Progra~1/ant/lib
$ ln -s /cygdrive/c/Program\ Files/sat/lib/sat.jar sat.jar
$ ln -s /cygdrive/c/Program\ Files/xt/xt.jar xt.jar

シンボリックリンクのないDOSプロンプトの場合はファイルをコピーする.Windowsのショートカットはsat.jar.lnkと言う別ファイルができるので使えない.

ビルドファイルの記述

sam.xmlとsam.xslを使ってsam.htmlを作成するタスクxml2htmlを定義したビルドファイルである.Sweet Ant Toolsのお約束として,要素projectの次行にタスクxtaskを定義してXTを使用する.

<!-- build.xml -->
<project name="sam" default="xml2html" basedir=".">
  <taskdef name="xtask" classname="net.sweetohm.ant.xml.XTask"/>

  <target name="xml2html">
    <xtask file="sam.xml" style="sam.xsl" tofile="sam.html"/>
  </target>
</project>

実行

実際にantを使ってファイルを作成する.まず,古いファイルは消す.

$ rm sam.html
$ ant
Buildfile: build.xml

xml2html:
    [xtask] Transforming: C:\Documents and Settings\sam\My Documents\ant\sam.xml

BUILD SUCCESSFUL

Total time: 2 seconds

$ ls
sam.html  sam.xml  sam.xsl

もう一度antを動かそう.sam.xml,sam.xslのタイムスタンプがsam.htmlより古く,sam.htmlのほうが新しいので,変換は行わない.

$ ant
Buildfile: build.xml

xml2html:

BUILD SUCCESSFUL

Total time: 1 second

Sweet Ant Toolsを使わずにXTを動かす(2002.8.4追記)

<java>タスクを使えばSweet Ant Toolsを使わずにXTを使うことができる.具体的には以下のような書き方になる.

<project name="sam" default="def" basedir=".">
  <property environment="env"/>
  <property name="xt.path" value="${env.PROGRAMFILES}/xt"/>
  <!-- XTのインストール先をxt.pathに設定 -->

  <target name="def">
    <java classname="com.jclark.xsl.sax.Driver">
      <classpath>
        <pathelement path="${xt.path}/xt.jar;${xt.path}/lib/xp.jar;."/>
        <!-- xt.jarとxp.jarのあるディレクトリの<code>classpath</code>への追加 -->
        <pathelement path="${java.class.path}"/>
      </classpath>
      <arg line="sam.xml sam.xsl sam.html"/>
    </java>
  </target>
</project>

style/xsltタスクを使う(2005.9.18追記)

<style>タスクまたは<xslt>タスクを使うことも可能である.<style>タスクと<xslt>タスクは,名前が異なるだけで使い方は同じである.上記と同じ内容の処理は以下のように記述する.

<project name="sam" default="def" basedir=".">
  <property environment="env"/>
  <property name="xt.path" value="${env.PROGRAMFILES}/xt"/>
  <!-- XTのインストール先をxt.pathに設定 -->

  <target name="def">
    <style style="sam.xsl" in="sam.xml" out="sam.html" classpath="${xt.path}/xt.jar;."/>
  </target>
</project>

<java>タスクを使う場合と異なり,classpathにxp.jarを指定しなくても動く.なお,使用したantのバージョンは1.6.4である.