Xalanとは、Apache XML Project が開発・配布しているプログラムで、XMLを他の形式へ変換(XMLからHTML等)するような場合などに使用できます。
インストール
-
Windowsへのインストロール
- serializer.jar
- xalan.jar
- xercesImpl.jar
- xml-apis.jar
Java版のxalan-j_2_7_1-bin.zip (Windows用)を Xalan-Javaのページからダウンロードして解凍します。
解凍された中に、xalanの実行に必要な4つのJARファイルがあることを確認します。
Windowsの場合、JDKのインストール先を変更しないと、JDKとJREが以下のようにインストールされているはずです。
C:\Program Files\Java\jdk1.6.0_31 C:\Program Files\Java\jreさらに、jreのディレクトリの中をみると、以下のディレクトリがあるはずです。この中に、xalanの4つのJARファイルをコピーします。
C:\Program Files\Java\jre\lib\ext
注 JDKの中のjre/lib/extの方にもコピーしないとxalanが動作しない場合があるかもしれませんが、JDKをデフォルトでインストールした場合 、JREのディレクトリへのコピーだけで動作しています。
注 WindowsXPにJDK 1.6.0_31をインストールした場合、環境変数でJAVA_HOMEやPATHの設定が無くても、 jre\lib\ext へのファイルコピーだけでxalanはコマンドプロンプトから実行できています。
設定・動作確認
コマンドプロンプトを開き、以下のようにオプションなしでxalanを実行し、以下のようにヘルプが表示されればOKです。
> java org.apache.xalan.xslt.Process
Xalan-J コマンド行 Process クラス・オプション:
-共通オプション-
[-XSLTC (変換に XSLTC を使用)]
[-IN inputXMLURL]
[-XSL XSLTransformationURL]
[-OUT outputFileName]
[-E (実体参照を展開しない)]
[-EDUMP {optional filename} (エラー時に stackdump を実行。)]
[-XML (XML フォーマッターを使用および XML ヘッダーを追加。)]
[-TEXT (シンプル・テキスト・フォーマッターを使用。)]
[-HTML (HTML フォーマッターを使用。)]
[-PARAM 名前式 (stylesheet パラメーターを設定。)]
[-MEDIA mediaType (文書と関連したスタイルシートを検索するメディア属性を使用。
)]
[-FLAVOR flavorName (変換を実行するために s2s=SAX または d2d=DOM を明示的に使
用。)]
[-DIAG (変換にかかった全ミリ秒を印刷。)]
[-URIRESOLVER 絶対クラス名 (URI を解決するために使用する URIResolver)]
[-ENTITYRESOLVER 絶対クラス名 (実体を解決するために使用する EntityResolver)]
(続けるには <return> を押してください)
[-CONTENTHANDLER 絶対クラス名 (出力をシリアライズするために使用する ContentHa
ndler)]
[-SECURE (セキュリティー保護された処理機能を true に設定)]
-Xalan 用オプション-
[-QC (静止パターン矛盾警告)]
[-TT (テンプレートを呼び出し中にトレース。)]
[-TG (各生成イベントをトレース。)]
[-TS (各選択イベントをトレース。)]
[-TTC (テンプレートの子を呼び出し中にトレース。)]
[-TCLASS (トレース拡張機能の TraceListener クラス。)]
[-L ソース・ドキュメントの行番号を使用]
[-INCREMENTAL (http://xml.apache.org/xalan/features/incremental を true に設
定することにより増分 DTM 構造を要求。)]
[-NOOPTIMIMIZE (http://xml.apache.org/xalan/features/optimize を false に設定
することによりスタイルシート最適化処理なしを要求。)]
[-RL recursionlimit (スタイルシートの再帰の深さについての数値限界を指定。)]
-XSLTC 用オプション-
[-XO [transletName] (名前を生成後の translet に割り当て)]
(続けるには <return> を押してください)
[-XD destinationDirectory (宛先ディレクトリーを translet に指定)]
[-XJ jarfile (translet クラスを名前 <jarfile> の JAR ファイルにパッケージしま
す)]
[-XP package (パッケージ名接頭部をすべての生成後の translet クラスに指定しま
す)]
[-XN (テンプレートをインラインで使用可能にします)]
[-XX (追加のデバッグ・メッセージ出力をオンにします)]
[-XT (可能な場合は translet を使用して変換)]
使用方法
XMLファイルをHTMLファイルに変換する場合は、以下のようにパラメータを指定して実行します。
java org.apache.xalan.xslt.Process -in [xmlファイル名] -xsl [xslファイル名] -out [出力ファイル名]
> java org.apache.xalan.xslt.Process -in src.xml -xsl mydoc.xls -out des.html
-
XLSTの変数値を引数で指定
変数値でXLSTの処理を変えたい場合、XalanのオプションでXLSTの変数値を指定することもできます。 指定方法は以下のようになります。複数指定したい場合は、-paramを複数指定します。
-param [変数名] [値]
以下のように変数outputTypeでスタイルシートの指定を変えるような場合
<xsl:param name="outputType">outputType</xsl:param>
・・・・
・・・・
<xsl:choose>
<xsl:when test="$outputType='sp'">
<link rel="stylesheet" href="css/sp_h5_style.css" type="text/css" />
<xsl:text disable-output-escaping="yes"><!--[if IE ]>
<link rel="stylesheet" type="text/css" href="/css/sp_h5_ie_style.css" />
<![endif]--></xsl:text>
</xsl:when>
<xsl:otherwise>
<link rel="stylesheet" href="css/h5_style.css" type="text/css" />
<xsl:text disable-output-escaping="yes"><!--[if IE ]>
<link rel="stylesheet" type="text/css" href="/css/h5_ie_style.css" />
<![endif]--></xsl:text>
</xsl:otherwise>
</xsl:choose>
Xalanの実行オプションで、以下のように変数を指定することができます。
java org.apache.xalan.xslt.Process -in test.xml -out test_sp.html -xsl mydocbook.xsl -param outputType sp -param dateNow '2014-1-20'
トラブル
-
実行でClassNotFoundExceptionが発生する
動作確認で、org.apache.xalan.xslt.Processが見つからなくて、ClassNotFoundExceptionが起こる場合、
D:\develop>java org.apache.xalan.xslt.Process
Exception in thread "main" java.lang.NoClassDefFoundError: org/apache/xalan/xslt
/Process
Caused by: java.lang.ClassNotFoundException: org.apache.xalan.xslt.Process
at java.net.URLClassLoader$1.run(Unknown Source)
at java.security.AccessController.doPrivileged(Native Method)
at java.net.URLClassLoader.findClass(Unknown Source)
at java.lang.ClassLoader.loadClass(Unknown Source)
at sun.misc.Launcher$AppClassLoader.loadClass(Unknown Source)
at java.lang.ClassLoader.loadClass(Unknown Source)
Could not find the main class: org.apache.xalan.xslt.Process. Program will exit
.
この場合、まず、JREのlib/ext/JDKのディレクトリの中を確認します。
C:\Program Files\Java\jre\lib\extここに、以下に必要な4つのファイルがあるかどうか?
- serializer.jar
- xalan.jar
- xercesImpl.jar
- xml-apis.jar
もし、全てあれば、JDKの中のJREのディレクトリを参照している可能性があるので、JDKの中にあるJREディレクトリの ”lib\ext"ディレクトリにも4つのファイルをコピーしてみます。
C:\Program Files\Java\jdk1.6.0_31\jre\lib\ext
The reference to entity ? must end with the ';' delimiter.
<ulink url="https://forums.virtualbox.org/viewtopic.php?f=7&t=45017">Fedora 15 DKMS</ulink>XMLの上記のような箇所で、以下のようなエラーが起こる場合
java org.apache.xalan.xslt.Process -in xml/com/linux/fedora15_virtualbox_install
.xml -xsl mydocbook.xsl -out html/com/linux/fedora15_virtualbox_install.tmp -htm
l
file:///D:/develop/docbook/xml/com/linux/fedora15_virtualbox_install.xml; 行 #13
0; 桁 #66; The reference to entity "t" must end with the ';' delimiter.
Output: html/com/linux/fedora15_virtualbox_install.html
これは urlの中に ”&” があるからです。この場合は、 ”& ” と修正すればエラーになりません。
<ulink url="https://forums.virtualbox.org/viewtopic.php?f=7&t=45017">Fedora 15 DKMS</ulink>
起動オプション PARAM
xalan の起動オプションでXLSTの変数とその値を定義することができます。 しかし、変数がXSLTの中で定義されていないとエラーになりました。
以下の例では、変数 dateNow が mydocbook.xsl で定義されていないためにエラーになっているようです。
java org.apache.xalan.xslt.Process -in xml/com/etc/xalan.xml -out html/com/etc/x
alan.html.tmp -xsl mydocbook.xsl -html -param dateNow 2012-08-05
file:///D:/develop/git/docs/ajisaba/mydocbook_base.xsl; 行 #33; 桁 #72; org.apac
he.xml.utils.WrappedRuntimeException: 名前が dateNow の変数が見つかりませんでし
た
(エラーの位置は不明)java.io.FileNotFoundException: D:\develop\git\docs\ajisaba\x
ml\com\etc\sdocbook.xsl (指定されたファイルが見つかりません。)
Xalan: は成功しませんでした。
(エラーの位置は不明)XSLT エラー (java.lang.RuntimeException): Xalan: は成功しま
せんでした。
Exception in thread "main" java.lang.RuntimeException: Xalan: は成功しませんでし
た。
at org.apache.xalan.xslt.Process.doExit(Process.java:1155)
at org.apache.xalan.xslt.Process.main(Process.java:1128)
この場合、XLST内で変数dateNowを定義しないといけないようです。上記のエラーの場合、以下のように同じ名前の変数をXSLT内で定義するとエラーが発生しないようになりました。
<xsl:param name="dateNow">updated</xsl:param>注. 上記ではデフォルト値が"updated"になります。
メイン・クラスorg.apache.xalan.xslt.Processが見つからなかった
Windowsのコマンドプロンプトから、直接実行した場合はエラーにならないのに、 同じコマンドプロンプトでrubyのsystem関数を通して実行すると、以下のようなエラーになります。
エラー: メイン・クラスorg.apache.xalan.xslt.Processが見つからなかったかロードで きませんでした
環境変数のPATHには、"C:\Program Files\Java\jdk1.6.0_31\bin" を追加していて、 xalan関係のjarファイルは、"C:\Program Files\Java\jre\lib\ext"に置いていました。 結局、jdkのjre\lib\ext方(以下)に置けばエラーが起こらないようになりました。
C:\Program Files\Java\jdk1.6.0_31\jre\lib\ext