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