1.3.6. XSLT拡張を使用したサンプル

1.3.6.1. 概要

XMLマッピングでJavaアプリケーションの利用方法を示します。
本例ではinput.xml中のyear、monthとdayをCalendarの形で出力し、そして、出力した内容を文字列の形で反転する機能を実装しています。
.xslファイルの作成
IntDate.javaとReverse.javaファイルを作成します。IntDate.javaの機能は日付を Calendarの形で出力し、Reverse.javaの機能は文字列を反転で出力します。具体的なコードは次の通りです。

IntDate.javaファイルのコード:
import java.util.Calendar;
import java.util.Date;

public class IntDate {
	public static Date getDate(String year, String month, String day) {
		// set the year, month, and day.
		Calendar c = Calendar.getInstance();
		// Convert each argument to int.
		c.set(Integer.parseInt(year), Integer.parseInt(month),
				Integer.parseInt(day));
		return c.getTime();
	}
}
Reverse.javaファイルのコード:
import java.util.Date;

public class Reverse {
	public static String reverse(Date date) {
		String retval = "";
		String str = date.toString();
		char[] b = new char[str.length()];
		str.getChars(0, str.length(), b, 0);
		for (int i = (b.length - 1); i >= 0; i--) {
			retval += b[i];
		}
		return retval;
	}
}
IntDate.javaとReverse.javaファイルをclassファイルにコンパイルし、そして、それらをtest.jarファイルにパッケージングします。 プロジェクトで右クリックして、プロパティーを選択して、プロパティーウィンドウを開きます。


図1.3.6.1-1

左側から Javaのビルド・パス を選択して、右側で ライブラリー に切り替えます。 JAR 追加 を利用して、test.jarをプロジェクトに関連します。 メニュー ファイル > 新規 > XMLマッピングファイル を選択し、XSLT.xmfファイルが新規に生成されます。


図1.3.6.1-2

ソーススキーマをsource.xsdに指定し、ターゲットスキーマをtarget.xsdに指定します。
source.xsd
<?xml version="1.0" encoding="UTF-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
  <xs:element name="year" type="xs:string">
  </xs:element>
  <xs:element name="month" type="xs:string">
  </xs:element>
  <xs:element name="inputdate">
    <xs:complexType>
      <xs:sequence>
        <xs:element ref="year"/>
        <xs:element ref="month"/>
        <xs:element ref="day"/>
      </xs:sequence>
    </xs:complexType>
   </xs:element>
   <xs:element name="day" type="xs:string">
   </xs:element>
</xs:schema>
target.xsd
<?xml version="1.0" encoding="UTF-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
  <xs:element name="root">
    <xs:complexType>
      <xs:sequence>
        <xs:element name="outputdate" type="xs:string"/>
        <xs:element name="reverse" type="xs:string"/>
      </xs:sequence>
    </xs:complexType>
  </xs:element>
</xs:schema>
ソース側のinputdate/year/text()ノードからターゲット側のroot/outputdate/text()ノードへ結線します。 ソース側のinputdate/year/text()ノードからターゲット側のroot/reverse/text()ノードへ結線します。


図1.3.6.1-3

ターゲット側のroot/outputdate/text()ノードで右クリックして、右クリックメニュー関数の編集を選択。 関数の編集ダイアログで 他の関数を挿入をクリックして、他の関数の挿入 ダイアログを開きます。


図1.3.6.1-4

パッケージで空を選択して、クラスでIntDateを選択して、メソッドでgetDate関数をダブルクリックして、エディタに挿入します。


図1.3.6.1-5

“./year/text()”という文字列を切り取って、”String arg0”に貼り付けます。エディタの内容は”java:IntDate.getDate(./year/text(), String arg1, String arg2)”になります。 “String arg1”という文字列を削除します(コンマは削除しません)。ノードを挿入をクリックして、ノードの挿入 ダイアログを開きます。ツリーからmonthのtext()ノードをダブルクリックして、ノードのXPathをエディタに挿入します。


図1.3.6.1-6

エディタの内容は” java:IntDate.getDate(./year/text(), ./month/text(), String arg2)”になります。 同じの手順で、ツリーからdayのtext()ノードのXPathをエディタに挿入します。エディタの内容は” java:IntDate.getDate(./year/text(), ./month/text(),./day/text())”になります。


図1.3.6.1-7

適用をクリックして、編集を保存します。 ターゲット側のroot/reverse/text()ノードで右クリックして、右クリックメニュー 関数の編集を選択。 まずは上記と同じのように、エディタの内容を修正します。 再度 他の関数を挿入をクリックして、他の関数の挿入ダイアログを開きます。


図1.3.6.1-8

パッケージで空を選択して、クラスでReverseを選択して、メソッドでreverse関数をダブルクリックして、エディタに挿入します。 エディタの内容を下記のように調整します。


図1.3.6.1-9

適用 をクリックして、編集を保存します。 編集に完成した後のXSLT.xmfファイルのXSLTコードは次の通りです。
<?xml version="1.0"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:java="http://xml.apache.org/xalan/java" exclude-result-prefixes="java" version="1.0">
  <xsl:output method="xml" version="1.0" omit-xml-declaration="no" encoding="UTF-8" indent="yes"/>
  <xsl:template match="/">
    <xsl:for-each select="inputdate">
      <xsl:call-template name="node1"/>
    </xsl:for-each>
  </xsl:template>
  <!--template for node /root-->
  <xsl:template name="node1">
    <root>
      <xsl:call-template name="node2"/>
      <xsl:call-template name="node3"/>
    </root>
  </xsl:template>
  <!--template for node /root/outputdate-->
  <xsl:template name="node2">
    <outputdate>
      <xsl:call-template name="node4"/>
    </outputdate>
  </xsl:template>
  <!--template for node /root/reverse-->
  <xsl:template name="node3">
    <reverse>
      <xsl:call-template name="node5"/>
    </reverse>
  </xsl:template>
  <!--template for node /root/outputdate/text()-->
  <xsl:template name="node4">
    <xsl:value-of select="java:IntDate.getDate(./year/text(), ./month/text(), ./day/text())"/>
  </xsl:template>
  <!--template for node /root/reverse/text()-->
  <xsl:template name="node5">
    <xsl:value-of select="java:Reverse.reverse(java:IntDate.getDate(./year/text(), ./month/text(), ./day/text()))"/>
  </xsl:template>
</xsl:stylesheet>
ツールバー中の XSL 出力 ボタンをクリックし、XSLT.xslファイルが生成されます。
実行
メニュー 実行 > 実行構成 を選択し、実行構成 ダイアログが表示されます。


図1.3.6.1-10

このダイアログで、変換元のXML ファイルにinput.xmlファイルを、XSL ファイルに生成されたXSLT.xslファイルを、変換先のXML ファイルに出力するoutput.xmlファイルをインポートします。実行中、下図のようにtest.jarファイルをインポートします。


図1.3.6.1-11

実行をクリックし、XSLT.xslを通してinput.xmlを必要なoutput.xmlファイルに変換します。input.xmlとoutput.xmlファイルのコードは次の通りです。 input.xmlファイルのコード:
<?xml version="1.0" encoding="Shift_JIS"?>
<inputdate>
  <year>2006</year>
  <month>08</month>
  <day>04</day>
</inputdate>
output.xmlファイルのコード:
<?xml version="1.0" encoding="UTF-8"?>
<root>
<outputdate>Mon Sep 04 17:44:23 CST 2006</outputdate>
<reverse>6002 TSC 32:44:71 40 peS noM</reverse>
</root>

1.3.6.2. 構成

表1.3.6.2-1
Sample_XSLT プロジェクト名
data/input.xml 変換元のXMLファイル
data/output.xml 変換先のXMLファイル
schema/source.xsd ソーススキーマファイル
schema/target.xsd ターゲットスキーマファイル
xsl/XSLT.xsl XSLファイル
XSLT.xmf XMLマッピングファイル
test.jar InData.classとReverse.classファイルを含むパッケージ


1.3.6.3. 実行手順

  1. サンプルプロジェクト Sample_XSLT.zip をインポートします。
  2. XSLT.xmfを開いて、メニュー 実行 > 実行構成 をクリックして、実行構成  ダイアログが表示されます。
  3. XMLマッピング をダブルクリックして、新規構成 を作成します。
  4. 新規構成 で、変換元のXMLファイル に「\Sample_XSLT\data\input.xml」を入力し、変換先のXMLファイル に「\Sample_XSLT\data\output.xml」を入力し、XSLファイル に「\Sample_XSLT\xsl\XSLT.xsl」を入力します。
  5. クラスバス に、test.jarを追加します。
  6. 実行 をクリックすると、output.xmlファイルが更新されます。

1.3.6.4. 注意事項

特になし。