1. インストール
  2. 設定・動作確認
    • 使用方法
    • トラブル


    Xalanとは、Apache XML Project が開発・配布しているプログラムで、XMLを他の形式へ変換(XMLからHTML等)するような場合などに使用できます。

    インストール

    • Windowsへのインストロール

    • Java版のxalan-j_2_7_1-bin.zip (Windows用)を Xalan-Javaのページからダウンロードして解凍します。

      解凍された中に、xalanの実行に必要な4つのJARファイルがあることを確認します。

      • serializer.jar
      • xalan.jar
      • xercesImpl.jar
      • xml-apis.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_HOMEPATHの設定が無くても、 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 [出力ファイル名]

      例  src.xml というXMLファイルから、 mydoc.xlsで定義した形式のHTMLファイルのdes.html を出力する場合
      > 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">&lt;!--[if IE ]&gt;
              &lt;link rel="stylesheet" type="text/css" href="/css/sp_h5_ie_style.css" /&gt;
              &lt;![endif]--&gt;</xsl:text>
            </xsl:when>
            <xsl:otherwise>
              <link rel="stylesheet" href="css/h5_style.css" type="text/css" />
              <xsl:text disable-output-escaping="yes">&lt;!--[if IE ]&gt;
              &lt;link rel="stylesheet" type="text/css" href="/css/h5_ie_style.css" /&gt;
              &lt;![endif]--&gt;</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つのファイルをコピーしてみます。

        例 JDK 1.6.0_31の場合
        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の中に ”&” があるからです。この場合は、 ”&amp; ” と修正すればエラーになりません。

            <ulink url="https://forums.virtualbox.org/viewtopic.php?f=7&amp;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