antでXTを使う−Sweet Ant Tools
使用環境
使用する各種ソフトは以下の通りである.必須なのはXT・ant・Sweet Ant Toolsの三つ.cygwinではなく,DOSコマンドプロンプトでも実行可能だが,慣れているのでcygwinを使用する.XT・ant・Sweet Ant Toolsのインストールは説明するが,Windows2000・cygwinのインストールの説明は割愛する.
- Windows2000 Professional+SP2
- cygwin 1.3.12-2
- XT 20020426a
- ant 1.5
- Sweet Ant Tools 0.6
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_HOME
,JAVA_HOME
,PATH
を設定する.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 Settings
やProgram 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である.