Microsoft Word - 2部-3.doc

Similar documents
XSLT 4-1

XMLとXSLT

オブジェクト指向プログラミング・同演習 5月21日演習課題

Java講座

Microsoft Word - 3部.doc

Java プログラミング Ⅰ 3 回目変数 変数 変 数 一時的に値を記憶させておく機能型 ( データ型 ) と識別子をもつ 2 型 ( データ型 ) 変数の種類型に応じて記憶できる値の種類や範囲が決まる 型 値の種類 値の範囲 boolean 真偽値 true / false char 2バイト文

Webプログラミング演習

Prog1_10th

Java プログラミング Ⅰ 7 回目 switch 文と論理演算子 条件判断文 3 switch 文 switch 文式が case の値と一致した場合 そこから直後の break; までを処理し どれにも一致しない場合 default; から直後の break; までを処理する 但し 式や値 1

問題1 以下に示すプログラムは、次の処理をするプログラムである

K227 Java 2


Prog1_15th

intra-mart Accel Platform — IM-Repository拡張プログラミングガイド   初版  

intra-mart Accel Platform — イベントナビゲータ 開発ガイド   初版   None

intra-mart Accel Platform — イベントナビゲータ 開発ガイド   初版  

(Microsoft PowerPoint - \223\306\217KJAVA\221\346\202R\224\ ppt)


Java プログラミング Ⅰ 3 回目変 数 今日の講義講義で学ぶ内容 変数とは 変数の使い方 キーボード入力の仕方 変 数 変 数 一時的に値を記憶させておく機能 変数は 型 ( データ型 ) と識別子をもちます 2 型 ( データ型 ) 変数に記憶する値の種類変数の型は 記憶できる値の種類と範囲

2

Web データ管理 JavaScript (1) (4 章 ) 2011/12/7( 水 ) 湘南工科大学講義資料 Web データ管理 (2011) 阿倍 1/21

Microsoft PowerPoint - chap10_OOP.ppt

GEC-Java

プログラミング入門1

2

JavaプログラミングⅠ

JavaプログラミングⅠ

メソッドのまとめ

Microsoft PowerPoint - prog03.ppt

Microsoft PowerPoint ppt

Prog2_9th

問題1 以下に示すプログラムは、次の処理をするプログラムである

JAVA入門

Java プログラミング Ⅰ 7 回目 switch 文と論理演算子 今日の講義講義で学ぶ内容 switch 文 論理演算子 条件演算子 条件判断文 3 switch 文 switch 文 式が case のラベルと一致する場所から直後の break; まで処理しますどれにも一致致しない場合 def

基礎計算機演習 実習課題No6

PowerPoint プレゼンテーション

Prog1_6th

情報処理Ⅰ

スライド 1

PowerPoint Presentation

Java Scriptプログラミング入門 3.6~ 茨城大学工学部情報工学科 08T4018Y 小幡智裕

問 次の Fortran プログラムの説明及びプログラムを読んで、設問に答えよ。

2

Javaプログラムの実行手順

JavaプログラミングⅠ

Microsoft PowerPoint Java基本技術PrintOut.ppt [互換モード]

Prog2_10th

XMLの利用(XMLとXSL)

JavaプログラミングⅠ

JavaプログラミングⅠ

Microsoft PowerPoint _2b-DOM.pptx

た場合クラスを用いて 以下のように書くことが出来る ( 教科書 p.270) プログラム例 2( ソースファイル名 :Chap08/AccountTester.java) // 銀行口座クラスとそれをテストするクラス第 1 版 // 銀行口座クラス class Account String name

XMLテクノロジを使いやすくする

intra-mart Accel Platform — IM-共通マスタ スマートフォン拡張プログラミングガイド   初版  

intra-mart Accel Platform

プログラミング基礎I(再)

Javaセキュアコーディングセミナー2013東京第1回 演習の解説

break 文 switch ブロック内の実行中の処理を強制的に終了し ブロックから抜けます switch(i) 強制終了 ソースコード例ソースファイル名 :Sample7_1.java // 入力値の判定 import java.io.*; class Sample7_1 public stati

PowerPoint プレゼンテーション

ガイダンス

Microsoft PowerPoint - prog09.ppt

Javaセキュアコーディングセミナー東京 第3回 入出力(File, Stream)と例外時の動作 演習解説

ただし 無作為にスレッドを複数実行すると 結果不正やデッドロックが起きる可能性がある 複数のスレッド ( マルチスレッド ) を安全に実行する ( スレッドセーフにする ) ためには 同期処理を用いるこ とが必要になる 同期処理は 予約語 synchronized で行うことができる ここでは sy

PowerPoint プレゼンテーション

XML Week Web 2.0 Day (1) SOA2.0 KM2.0? REST API + XSLT Amazon hon. hon.jp API XML Consortium XML ( ) REST(GET)API Amazon.co.jp hon.jp REST

Microsoft PowerPoint - prog09.ppt

JavaプログラミングⅠ

Java知識テスト問題

Java言語 第1回

プログラミング入門1

Exam : 1z1-809-JPN Title : Java SE 8 Programmer II Vendor : Oracle Version : DEMO Get Latest & Valid 1z1-809-JPN Exam's Question and Answers 1 from Ac

052-XML04/fiÁ1-part3-’ÓŠ¹

JAVA とテンプレート

Android Layout SDK プログラミング マニュアル

JAVA入門

前ページからの続き // テキストボックス02 id 属性で取得 // id 属性で取得する場合は一意に決まるので 何番目かの指定は不要 var textbox02elem = document.getelementbyid("text_box02_id"); if ("001" == statee

XMLプログラミング(DOM編)

マークアップ言語

Web2.0 REST API + XSLT Amazon hon.jp API XML Consortium XML ( ) REST(GET)API hon.jp Amazon.co.jp Google Map Exif to RDF(kanzaki.com) REST +

2016 年度 JAVA 講座第六週目 目次 パッケージ... 2 パッケージの作成... 2 パッケージの使用方法... 3 異なるパッケージ同名クラスの宣言... 4 パッケージの側面から見たアクセス修飾子... 4 ラッパークラス... 5 ラッパークラス利用法:キャスト... 5 ラッパーク

PowerPoint プレゼンテーション

問 次の Fortran プログラムの説明及びプログラムを読んで、設問に答えよ。

プログラミングA

Brekeke PBX - Version 2.1 ARSプラグイン開発ガイド

(1) プログラムの開始場所はいつでも main( ) メソッドから始まる 順番に実行され add( a,b) が実行される これは メソッドを呼び出す ともいう (2)add( ) メソッドに実行が移る この際 add( ) メソッド呼び出し時の a と b の値がそれぞれ add( ) メソッド

Java 基礎問題ドリル ~ メソッドを理解する ~ 次のプログラムコードに 各設問の条件にあうメソッドを追加しなさい その後 そのメソッドが正しく動作することを検証するためのプログラムコードを main メソッドの中に追加しなさい public class Practice { // ここに各設問

JavaScript演習

コンピュータ中級B ~Javaプログラミング~ 第3回 コンピュータと情報をやりとりするには?

フォームとインナー HTML を使って動的にページ内の文章を変更しよう 問題 1. つぎの指示と画面を参考に HTML を組みなさい 仕様 テキストボックスに任意の文字を入力し [ コメント ] ボタンをクリックすると 下部の文章がテキストボックスの内容に置き換わる フォーム名 : f1 テキストボ

Prog2_12th

解答上の注意 1 解答は 解答 紙の問題番号に対応した解答欄にマークしなさい 2 選択肢は 問ごとに 意されています 問 1の選択肢は 問 2で使 しません 3 選択肢は量が多いため 探しやすさの観点よりグループ分けされています グループ分けに合わせて解答欄が区切られていますが 横 1 列で問題 1

スライド 1

プログラミング入門1

XSLT XSLT xsd XSLT XML xsd XPath <xsl:template ]

.NETプログラマー早期育成ドリル ~VB編 付録 文法早見表~

プログラミング入門1

プログラムの基本構成

医療者のための情報技術入門第 9 回プログラムがはたらくしくみを学ぶ (2) 日紫喜光良 概要 1. はじめに- 具体例から ここから Javascript のプログラミング入門 次はどうする--

文字列操作と正規表現

PowerPoint プレゼンテーション

Transcription:

目 次... 3 1. 課題の概要... 3 図 1 XSLT スタイルシートによる HTML 変換...3 リスト1 プログラム実行イメージ (HTML 変換モード )... 3 図 2 HTML 変換モードの HTML をブラウザで表示したときの例...4 リスト2 プログラム実行イメージ ( 人気ランキングモード )... 5 リスト3 人気ランキングモードのリストの条件... 5 図 3 人気ランキングモードのリストのツリー構造... 5 リスト4 人気ランキングリスト XML サンプル... 6 リスト5 プログラム実行イメージ ( オリジナル CD 検索モード )...6 2. 課題の開発手順... 7 図 4 課題の開発手順... 7 3.XSLT の作成... 8 3.1 CD アルバムデータを HTML に加工する XSLT... 9 参考 output 要素の method について ( 抜粋 )...9 リスト6 CDAlbumList.xsl... 15 リスト7 CDAlbumList.html... 18 リスト8 OriginalCDList.xsl... 20 3.2 人気ランキングを HTML に加工する XSLT... 22 リスト9 CDRanking.xsl...23 4. プログラムの作成... 25 図 5 プログラムの全体の流れ... 26 5. プログラムの詳細説明...29 5.1 クラスのインポートと引数のチェック...29 5.2 HTML 変換モードの処理... 32 5.2.1 XSLT 変換およびファイルへ書き出し... 32 5.3 人気ランキングモードの処理... 34 5.3.1 ランキングの一覧を取得... 34 5.3.2 XML の作成...36 5.3.3 ファイルへ書き出し... 38 5.4 オリジナル CD 検索モードの処理... 39 5.4.1 検索結果を表示... 39 5.5 SAX イベントハンドラ... 40 5.5.1 人気ランキングイベントハンドラ...40-1 - 第 2 部 CD 製作会社のマーケティング調査

5.5.2 オリジナル CD 検索イベントハンドラ... 43 6. プログラムのコンパイルと実行... 45 リスト10 プログラムのコンパイル... 45 7. コーディングリスト... 46 リスト11 CDAlbumList.java... 46-2 -

1. 課題の概要 CD アルバム一覧やランキングなどの各種情報をブラウザで表示出来るよう データを HTML に加工します まず HTML 変換モードでは コマンドプロンプトから XML ファイル名 XSLT ファイル名 HTML ファイル名を入力し XML データを HTML ファイルとして保存します 次の図 1およびリスト1は CD アルバムデータである XML ファイル ( 課題 2で作成した 複数のアルバムデータを1つの XML に結合したもの ) をソースデータとし あらかじめ用意した XSLT スタイルシートを指定することによって HTML 変換を行った実行イメージです XML ファイル (CDAlbumList.xml) XSLT ファイル (CDAlbumList.xsl) 変換プログラム OriginalCDList(HTML 変換モード ) HTML ファイル (CDAlbumList.html) 図 1 XSLT スタイルシートによる HTML 変換 リスト 1 プログラム実行イメージ (HTML 変換モード : 太字はコマンド入力および入力 データ ) C: java>java OriginalCDList html >>> XML ファイル名 ( 入力ソース ) CDAlbumList.xml >>> XSLT ファイル名 ( スタイルシート ) CDAlbumList.xsl >>> HTML ファイル名 ( 出力ファイル ) CDAlbumList.html 出力しました C: java> - 3 - 第 2 部 CD 製作会社のマーケティング調査

次の図は 作成された HTML ファイルをブラウザで表示したときのイメージです 図 2 HTML 変換モードの HTML をブラウザで表示したときの例 - 4 -

一方人気ランキングモードでは 入力及び出力 XML ファイル名を指定し 人気ランキングとなる XML ファイルを作成します 次のリスト2は オリジナル CD データである XML ファイル ( 後ほど作成する 複数のオリジナルデータを1つの XML に結合したもの ) をソースデータとし 人気ランキング XML ファイルを作成する実行イメージです リスト 2 プログラム実行イメージ ( 人気ランキングモード : 太字はコマンド入力および 入力データ ) C: java> java OriginalCDList -ranking >>> XML 入力ファイル名 OriginalCDList.xml >>> XML 出力ファイル名 CDRanking.xml 出力しました C: java> 人気ランキングモードのリストは次のリスト 3 の条件に従い 図 3 のツリー構造の XML で保存します リスト3 人気ランキングモードのリストの条件 1. ルート要素名を CDRanking とする 2.1 つのランキング情報を Rank 要素に記録する 3. アーティスト名を Artist 要素に記録する 4. 曲名を Title 要素に記録する 5. 曲時間を Time 要素に記録する 6. その曲を選択した学生の人数を Num 要素に記録する CDRanking 要素 Rank 要素 Artist 要素 Title 要素 Time 要素 Num 要素図 3 人気ランキングモードのリストのツリー構造 - 5 - 第 2 部 CD 製作会社のマーケティング調査

また実際に保存される XML ファイルは リスト 4 のような XML となります リスト 4 人気ランキングリスト XML サンプル ( 太字は入力データ ) <?xml version="1.0" encoding="shift_jis"?> <CDRanking> <Rank> <Artist> アーティスト 2</Artist> <Title> 曲名 3</Title> <Time>456</Time> <Num>3</Num> </Rank> <Rank> <Artist> アーティスト 1</Artist> <Title> 曲名 2</Title> <Time>234</Time> <Num>2</Num> </Rank> <Rank> <Artist> アーティスト 3</Artist> <Title> 曲名 1</Title> <Time>154</Time> <Num>1</Num> </Rank> </CDRanking> そしてオリジナル CD 検索モードでは ソースデータとなる XML ファイル名と検索曲名を入力することによって その曲をオリジナル CD に選んでいる学生の一覧を表示します 次のリスト3は オリジナル CD データである XML ファイル ( 後ほど作成する 複数のオリジナルデータを1つの XML に結合したもの ) をソースデータとし 曲名を検索する実行イメージです リスト 5 プログラム実行イメージ ( オリジナル CD 検索モード : 太字はコマンド入力お よび入力データ ) C: java> java OriginalCDList -search >>> XML ファイル名 OriginalCDList.xml >>> 曲名曲名 2 鈴木一郎 山田太郎 C: java> - 6 -

2. 課題の開発手順 課題 1 では JAXB 課題 2 では DOM と SAX を使用してプログラミングしました 今回 の課題 3 では DOM と SAX に加えて XSLT(XSL Transformations) を使用します XSLT は XML を HTML やプレーンテキスト 別の構造の XML に変換するための言語です 課題 3 では図 4 の順番で作成します HTML 変換モードで使用する XSLT スタイルシートの作成 CD データ結合 XML (CDAlbumList.xml) HTML ファイル (CDAlbumList.html) HTML 変換モード 図 4 課題の開発手順 プログラムを作成 (Java プログラミング ) プログラム実行 (Java による実行 ) オリジナル CD 検索モード オリジナルデータ結合 XML (OriginalCDList.xml) ランキングデータ XML (CDRanking.xml) 入力ランキングモード - 7 - 第 2 部 CD 製作会社のマーケティング調査

3.XSLT の作成 HTML 変換モードで使用する XSLT スタイルシートの作成 CD データ結合 XML (CDAlbumList.xml) HTML ファイル (CDAlbumList.html) HTML 変換モード プログラムを作成 (Java プログラミング ) プログラム実行 (Java による実行 ) オリジナル CD 検索モード オリジナルデータ結合 XML (OriginalCDList.xml) ランキングデータ XML (CDRanking.xml) 入力ランキングモード それでは 手順に従って XSLT とプログラムを作成していきます - 8 -

3.1 CD アルバムデータを HTML に加工する XSLT まず最初に 課題 2で作成した複数の CD アルバムを結合した XML を HTML に加工するための XSLT スタイルシートを作成します XSLT には非常に多くの要素や関数があるためそれらの全部を説明することは出来ませんが これから使用する要素 関数について 順次解説をします 1: <?xml version="1.0" encoding="shift_jis"?> XML 文書の宣言です XSLT スタイルシート自体も XML で作成しますので この宣言 が必要です 2: <xsl:stylesheet 3: xmlns:xsl="http://www.w3.org/1999/xsl/transform" version="1.0" 4: xmlns:cdlist="urn:educationproject:popularlist"> ルート要素の宣言です XSLT では ルート要素名は stylesheet と決まっています stylesheet の前に xsl: という文字が付いています これは XML Schema と同様に名前空間接頭辞と呼ばれるものです 3 行目の xmlns:cdlist="urn:educationproject:cdlist" は2 行目と似ています 何が違うかと言うと 2 行目は XSLT 自体の宣言だったのに対し 3 行目はデータソース XML に対する宣言になります ここでは cdlist: という名前空間接頭辞が付いています XSLT でデータソース XML を指定する際には必ず名前空間接頭辞を使用します 5: <xsl:output method="html" indent="yes"/> 出力するファイルのデータ形式とインデントの有無を指定します 参考 output 要素の method について ( 抜粋 ) xml html text XML を出力 HTML を出力 プレーンテキストを出力 - 9 - 第 2 部 CD 製作会社のマーケティング調査

7: <xsl:template match="/"> 8: <xsl:apply-templates select="cdlist:cdlist"/> 9: </xsl:template> template は match 属性で指定した要素にマッチした場合の処理を記述します template のことをテンプレートルールといいます 複数の template の中で 特に match="/" で指定されるテンプレートルール( ドキュメントルート / にマッチするテンプレートルール ) から処理されます そしてテンプレートルールの中に apply-templates などのテンプレートを記述します apply-templates は select 属性で指定したものと同じ template を探して処理します もしも select 属性で複数の要素を選択した場合 複数の要素を順順に処理します 今回はルート要素 (1つの CDList 要素 ) にマッチした場合の処理です - 10 -

11: <xsl:template match="cdlist:cdlist"> 12: <html> 13: <head> 14: <title>cd リスト </title> 15: </head> 16: <script language='javascript'> 17: var dispid = "1"; 18: function disp(id) 19: { 20: var item; 21: item = document.all.item(dispid); 22: item.style.display = "none"; 23: dispid = id; 24: item = document.all.item(dispid); 25: item.style.display = "block"; 26: } 27: </script> 28: <table WIDTH="100%"> 29: <tr valign="top"> 30: <td width="30%"> 31: <h1>cd リスト </h1> 32: <xsl:apply-templates select="cdlist:cd" mode="left"/> 33: </td> 34: <td width="70%"> 35: <xsl:apply-templates select="cdlist:cd" mode="right"/> 36: </td> 37: </tr> 38: </table> 39: </html> 40: </xsl:template> cdlist:cdlist 要素にマッチした場合の処理です 実際には <xsl:apply-templates select="cdlist:cdlist"/> から呼び出されます その後は 一部の XSLT 要素を除きほぼ通常の HTML になります ただし XSLT スタイルシートは XML ですから XML の規約に準じて記述する必要がります 通常の HTML との大きな違いは開始タグと終了タグの対応がきちんと取れていることです <br> のような開始タグしか使わないものは <br/> のように記述します ここで定義している JavaScript を簡単に説明します HTML の <div> タグ等では style 属性を指定することにより そのブロックの表示 非表示を切り替えることが出来ます - 11 - 第 2 部 CD 製作会社のマーケティング調査

<div style="display:block"> で表示され <div style="display:none"> で非表示になります この <div> タグに id 属性を設定すると JavaScript から style 属性の操作が出来るようになります つまり dispid 変数に現在表示されている id を保存しておけば 次に表示したい id を指定して disp 関数を呼び出すことにより 表示するブロックを切り替えることが可能です <xsl:apply-templates select="cdlist:cd" mode="left"/> と <xsl:apply-templates select="cdlist:cd" mode="right"/> では select 属性以外に mode 属性が設定されています これは同じ cdlist:cd 要素にマッチした場合で いくつかの処理を分けたい場合の識別に使用します 42: <xsl:template match="cdlist:cd" mode="left"> 43: <xsl:element name="a"> 44: <xsl:attribute name="href">javascript:disp('<xsl:value-of 45: select="position()"/>')</xsl:attribute> 46: <xsl:value-of select="cdlist:name"/> 47: </xsl:element><p/> 48: </xsl:template> <xsl:apply-templates select="cdlist:cd" mode="left"/> から呼び出された場合の処理です element は name 属性で指定したタグを作成します そのタグで属性を指定する必要がある場合 さらに attribute で属性を指定します element が閉じられると終了タグとなります value-of は select 属性で指定した内容がそのまま書き出されます position() は XML での現在の要素 ( cdlist:cd ) の位置 ( 何番目の要素か?) を意味します したがってたとえば cdlist:cd 要素の位置が 2 (2 番目 ) で cdlist:title 要素の内容が タイトル 2 だとすると <a href= javascript:disp('2') > タイトル 2</a><p/> というタグが作成されます - 12 -

50: <xsl:template match="cdlist:cd" mode="right"> 51: <xsl:element name="div"> 52: <xsl:attribute name="id"> 53: <xsl:value-of select="position()"/> 54: </xsl:attribute> 55: <xsl:attribute name="style"> 56: <xsl:if test="position()=1">display:block</xsl:if> 57: <xsl:if test="position()>1">display:none</xsl:if> 58: </xsl:attribute> 59: <xsl:element name="img"> 60: <xsl:attribute name="src"> 61: <xsl:choose> 62: <xsl:when test="cdlist:image/text()"> 63: <xsl:value-of select="cdlist:image"/> 64: </xsl:when> 65: <xsl:otherwise>dummy.jpg</xsl:otherwise> 66: </xsl:choose> 67: </xsl:attribute> 68: <xsl:attribute name="align">right</xsl:attribute> 69: <xsl:attribute name="width">250</xsl:attribute> 70: <xsl:attribute name="height">250</xsl:attribute> 71: </xsl:element> 72: <h2><xsl:value-of select="cdlist:title"/></h2> 73: <h2><xsl:value-of select="cdlist:artist"/></h2> 74: 発売日 :<xsl:value-of select="substring(cdlist:release, 1, 10)"/><br/> 75: <xsl:apply-templates select="cdlist:musiclist/cdlist:music"/> 76: </xsl:element> 77: </xsl:template> <xsl:apply-templates select="cdlist:cd" mode="right"/> から呼び出された場合の処 理です if は test 属性で指定した式が真の場合にその内容が処理されます 真でなければ その if ブロックは処理されません すなわち 1 番目の CD 要素は <div> タグの style 属性が display:block( 表示状態 ) となり 2 番目以降の CD 要素は <div> タグの style 属性 が display:none( 非表示状態 ) となります choose ブロックでは 最初に when の test 属性が評価され test 属性で指 定した式が真の場合に when の内容が処理され 真でなければ otherwise の内容が 処理されます Image 要素については空要素である場合もあるため Image 要素がテキス トノードを持つことが真であるなら つまり Image 要素が空要素でないなら 属性の値と - 13 - 第 2 部 CD 製作会社のマーケティング調査

して Image 要素の文字列を取り出します そうでなければ属性の値を dummy.jpg とします substring(cdlist:release, 1, 10) は cdlist:release の1 文字目から10 文字を取り出します Release 要素には 2004-06-30+09:00 などの値が保存されていますので 先頭の10 文字を取り出します <xsl:apply-templates select="cdlist:musiclist/cdlist:music"/> のように select 属性で / を用いた階層指定もできます この記述で MusicList 要素の子要素である Music 要素を処理します 79: <xsl:template match="cdlist:music"> 80: <xsl:value-of select="position()"/>. 81: <xsl:value-of select="@title"/> 82: <xsl:value-of select="floor(@time div 60)"/> 分 83: <xsl:value-of select="@time mod 60"/> 秒 <br/> 84: </xsl:template> @Title は Title 属性を取り出します 属性の頭には @ を付ける必要があります から呼び出された場合の処理です はスペースを意味し HTML では に変換されます floor(@time div 60) は Time 属性を60で割った商を小数点以下で切り捨てます 又 @Time mod 60 は Time 属性を60で割った余りです つまり秒数から mm 分 ss 秒 の形式に変換しています これで XSLT が作成出来ました 完成した XSLT の例と変換した後の HTML をそれぞ れリスト 6 とリスト 7 に示します 尚 オリジナル CD リストを結合した場合の XML を HTML に加工する XSLT スタイルシートは ほぼ同様に作成出来ます その例をリスト8に示します ここで必要なオリジナル CD リストを結合するプログラムは 課題 2の CD アルバムデータ結合プログラムのファイル名の判断の部分を CD から FV に変更するだけで使用出来ます - 14 -

リスト6 CDAlbumList.xsl( 太字は任意設定値 ) 1: <?xml version="1.0" encoding="shift_jis"?> 2: <xsl:stylesheet 3: xmlns:xsl="http://www.w3.org/1999/xsl/transform" version="1.0" 4: xmlns:cdlist="urn:educationproject:popularlist"> 5: <xsl:output method="html" indent="yes"/> 6: 7: <xsl:template match="/"> 8: <xsl:apply-templates select="cdlist:cdlist"/> 9: </xsl:template> 10: 11: <xsl:template match="cdlist:cdlist"> 12: <html> 13: <head> 14: <title>cd リスト </title> 15: </head> 16: <script language='javascript'> 17: var dispid = "1"; 18: function disp(id) 19: { 20: var item; 21: item = document.all.item(dispid); 22: item.style.display = "none"; 23: dispid = id; 24: item = document.all.item(dispid); 25: item.style.display = "block"; 26: } 27: </script> 28: <table WIDTH="100%"> 29: <tr valign="top"> 30: <td width="30%"> 31: <h1>cd リスト </h1> 32: <xsl:apply-templates select="cdlist:cd" mode="left"/> 33: </td> 34: <td width="70%"> 35: <xsl:apply-templates select="cdlist:cd" mode="right"/> 36: </td> 37: </tr> 38: </table> - 15 - 第 2 部 CD 製作会社のマーケティング調査

39: </html> 40: </xsl:template> 41: 42: <xsl:template match="cdlist:cd" mode="left"> 43: <xsl:element name="a"> 44: <xsl:attribute name="href">javascript:disp('<xsl:value-of 45: select="position()"/>')</xsl:attribute> 46: <xsl:value-of select="cdlist:title"/> 47: </xsl:element><p/> 48: </xsl:template> 49: 50: <xsl:template match="cdlist:cd" mode="right"> 51: <xsl:element name="div"> 52: <xsl:attribute name="id"> 53: <xsl:value-of select="position()"/> 54: </xsl:attribute> 55: <xsl:attribute name="style"> 56: <xsl:if test="position()=1">display:block</xsl:if> 57: <xsl:if test="position()>1">display:none</xsl:if> 58: </xsl:attribute> 59: <xsl:element name="img"> 60: <xsl:attribute name="src"> 61: <xsl:choose> 62: <xsl:when test="cdlist:image/text()"> 63: <xsl:value-of select="cdlist:image"/> 64: </xsl:when> 65: <xsl:otherwise>dummy.jpg</xsl:otherwise> 66: </xsl:choose> 67: </xsl:attribute> 68: <xsl:attribute name="align">right</xsl:attribute> 69: <xsl:attribute name="width">250</xsl:attribute> 70: <xsl:attribute name="height">250</xsl:attribute> 71: </xsl:element> 72: <h2><xsl:value-of select="cdlist:title"/></h2> 73: <h2><xsl:value-of select="cdlist:artist"/></h2> 74: 発売日 :<xsl:value-of select="substring(cdlist:release, 1, 10)"/><br/> 75: <xsl:apply-templates select="cdlist:musiclist/cdlist:music"/> 76: </xsl:element> 77: </xsl:template> 78: 79: <xsl:template match="cdlist:music"> - 16 -

80: <xsl:value-of select="position()"/>. 81: <xsl:value-of select="@title"/> 82: <xsl:value-of select="floor(@time div 60)"/> 分 83: <xsl:value-of select="@time mod 60"/> 秒 <br/> 84: </xsl:template> 85: 86: </xsl:stylesheet> - 17 - 第 2 部 CD 製作会社のマーケティング調査

リスト7 CDAlbumList.html <html xmlns:cdlist="urn:educationproject:cdlist"> <head> <META http-equiv="content-type" content="text/html; charset=shift_jis"> <title>cd リスト </title> </head> <script language="javascript"> var dispid = "1"; function disp(id) { var item; item = document.all.item(dispid); item.style.display = "none"; dispid = id; item = document.all.item(dispid); item.style.display = "block"; } </script> <table WIDTH="100%"> <tr valign="top"> <td width="30%"> <h1>cd リスト </h1> <a href="javascript:disp('1')"> タイトル 1</a> <p></p> <a href="javascript:disp('2')"> タイトル 2</a> <p></p> <a href="javascript:disp('3')"> タイトル 3</a> <p></p> </td><td width="70%"> <div id="1" style="display:block"> <img src="image1.bmp" align="right"><h2> タイトル 1</h2> <h2> アーティスト 1</h2> 発売日 :2004-11-22<br>1. 曲名 1-1 2 分 34 秒 <br>2. 曲名 1-2 6 分 12 秒 <br> </div> <div id="2" style="display:none"> - 18 -

<img src="image2.jpg" align="right"><h2> タイトル 2</h2> <h2> アーティスト 2</h2> 発売日 :2004-11-22<br>1. 曲名 2-1 2 分 34 秒 <br>2. 曲名 2-2 6 分 12 秒 <br>3. 曲名 2-3 7 分 36 秒 <br> </div> <div id="3" style="display:none"> <img src="image3.gif" align="right"><h2> タイトル 3</h2> <h2> アーティスト 3</h2> 発売日 :2004-11-22<br>1. 曲名 3-1 2 分 34 秒 <br>2. 曲名 3-2 6 分 12 秒 <br> </div> </td> </tr> </table> </html> - 19 - 第 2 部 CD 製作会社のマーケティング調査

リスト8 OriginalCDList.xsl( 太字は任意設定値 ) 1: <?xml version="1.0" encoding="shift_jis"?> 2: <xsl:stylesheet 3: xmlns:xsl="http://www.w3.org/1999/xsl/transform" version="1.0" 4: xmlns:cdlist="urn:educationproject:popularlist"> 5: <xsl:output method="html" indent="yes"/> 6: 7: <xsl:template match="/"> 8: <xsl:apply-templates select="cdlist:cdlist"/> 9: </xsl:template> 10: 11: <xsl:template match="cdlist:cdlist"> 12: <html> 13: <head> 14: <title>cd リスト </title> 15: </head> 16: <script language='javascript'> 17: var dispid = "1"; 18: function disp(id) 19: { 20: var item; 21: item = document.all.item(dispid); 22: item.style.display = "none"; 23: dispid = id; 24: item = document.all.item(dispid); 25: item.style.display = "block"; 26: } 27: </script> 28: <table WIDTH="100%"> 29: <tr valign="top"> 30: <td width="30%"> 31: <h1>cd リスト </h1> 32: <xsl:apply-templates select="cdlist:cd" mode="left"/> 33: </td> 34: <td width="70%"> 35: <xsl:apply-templates select="cdlist:cd" mode="right"/> 36: </td> 37: </tr> 38: </table> - 20 -

39: </html> 40: </xsl:template> 41: 42: <xsl:template match="cdlist:cd" mode="left"> 43: <xsl:element name="a"> 44: <xsl:attribute name="href">javascript:disp('<xsl:value-of 45: select="position()"/>')</xsl:attribute> 46: <xsl:value-of select="cdlist:name"/> 47: </xsl:element><p/> 48: </xsl:template> 49: 50: <xsl:template match="cdlist:cd" mode="right"> 51: <xsl:element name="div"> 52: <xsl:attribute name="id"> 53: <xsl:value-of select="position()"/> 54: </xsl:attribute> 55: <xsl:attribute name="style"> 56: <xsl:if test="position()=1">display:block</xsl:if> 57: <xsl:if test="position()>1">display:none</xsl:if> 58: </xsl:attribute> 59: <h2><xsl:value-of select="cdlist:name"/></h2><br/> 60: <xsl:apply-templates select=" cdlist:musiclist /cdlist:music"/> 61: </xsl:element> 62: </xsl:template> 63: 64: <xsl:template match="cdlist:music"> 65: <h3> 66: <xsl:value-of select="position()"/>. 67: <xsl:value-of select="@title"/> 68: <xsl:value-of select="floor(@time div 60)"/> 分 69: <xsl:value-of select="@time mod 60"/> 秒 70: </h3><br/> 71: 感想 : 72: <xsl:value-of select="cdlist:feeling"/><br/> 73: オリジナル CD: 74: <xsl:if test="cdlist:status='r'"> 保留 </xsl:if> 75: <xsl:if test="cdlist:status='p'"> 追加済み </xsl:if> 76: <br/><br/><br/> 77: </xsl:template> 78: 79: </xsl:stylesheet> - 21 - 第 2 部 CD 製作会社のマーケティング調査

3.2 人気ランキングを HTML に加工する XSLT 次に 今回プログラムで作成する人気ランキングの XML を HTML に加工する XSLT を作成します 基本的な内容は CD アルバムを結合した XML を HTML に加工する XSLT と同様です 新しい XSLT 構文を使用する部分のみ説明します 尚 ここでは名前空間接頭辞を定義せずに作成します 31: <xsl:template match="rank"> 32: <xsl:param name="num" select="num"/> 33: <tr> 34: <td><xsl:value-of select="count(//rank[num>$num]) + 1"/></td> 35: <td><xsl:value-of select="title"/></td> 36: <td><xsl:value-of select="floor(@time div 60)"/> 分 37: <xsl:value-of select="@time mod 60"/> 秒 <td/> 38: <td><xsl:value-of select="num"/></td> 39: </tr> 40: </xsl:template> 人気ランキングの一覧を表示する場合に 同じ人気 つまりその曲を選択した学生の人数が同じ場合には 順位を同じにする必要があります そのため順位の決定方法を 対象 Rank 要素の Num 要素の値 ( その曲を選択した学生の人数 ) とその他の Rank 要素の Num 要素の値を比較し 対象 Rank 要素の Num 要素の値よりも大きい値の Num 要素を持つ Rank 要素の数 ( つまり対象 Rank 要素よりも上位の Rank 要素の数 ) をカウントし それに1を足した値 としています param は name 属性で指定した変数に select 属性で指定した値を代入します ここでは num という変数に Num 要素の値( 対象 Rank 要素の Num 要素の値 ) を代入しています 次に count(//rank[num>$num]) + 1 という内容を表示しています ここで //Rank[Num>$num] とありますが //Rank はルート要素以下全ての Rank 要素という意味で [Num>$num] が取り出す条件を指定しています つまり ルート要素以下全ての Rank 要素の Num 子要素の値が 現在の Rank 要素の Num 要素の値より大きいものををカウントして それに1を足しています 完成した XSLT の例をリスト 9 に示します - 22 -

リスト9 CDRanking.xsl( 太字は任意設定値 ) 1: <xsl:stylesheet 2: xmlns:xsl="http://www.w3.org/1999/xsl/transform" version="1.0"> 3: <xsl:output method="html" indent="yes"/> 4: 5: <xsl:template match="/"> 6: <xsl:apply-templates select="cdranking"/> 7: </xsl:template> 8: 9: <xsl:template match="cdranking"> 10: <html> 11: <head> 12: <title> 楽曲人気ランキング </title> 13: </head> 14: <body> 15: <div align="center"> 16: <h1> 楽曲人気ランキング </h1> 17: <table border="2"> 18: <tr> 19: <th> 順位 </th> 20: <th> 曲名 </th> 21: <th> 時間 </th> 22: <th> 人数 </th> 23: </tr> 24: <xsl:apply-templates select="rank"/> 25: </table> 26: </div> 27: </body> 28: </html> 29: </xsl:template> 30: 31: <xsl:template match="rank"> 32: <xsl:param name="num" select="num"/> 33: <tr> 34: <td><xsl:value-of select="count(//rank[num>$num]) + 1"/></td> 35: <td><xsl:value-of select="title"/></td> 36: <td><xsl:value-of select="floor(@time div 60)"/> 分 37: <xsl:value-of select="@time mod 60"/> 秒 <td/> 38: <td><xsl:value-of select="num"/></td> - 23 - 第 2 部 CD 製作会社のマーケティング調査

39: </tr> 40: </xsl:template> 41: 42: </xsl:stylesheet> - 24 -

4. プログラムの作成 HTML 変換モードで使用する XSLT スタイルシートの作成 CD データ結合 XML (CDAlbumList.xml) HTML ファイル (CDAlbumList.html) HTML 変換モード プログラムを作成 (Java プログラミング ) プログラム実行 (Java による実行 ) オリジナル CD 検索モード オリジナルデータ結合 XML (OriginalCDList.xml) ランキングデータ XML (CDRanking.xml) 入力ランキングモード - 25 - 第 2 部 CD 製作会社のマーケティング調査

プログラムの全体の流れは図 5 のようになります 5.1 クラスのインポートと引数のチェック 5.2 HTML 変換モードの処理 5.2.1 ファイルへ書き出し (XSLT) 5.3 人気ランキングモードの処理 5.3.1 ランキングの一覧を取得 (SAX) 5.3.2 XML の作成 (DOM) 5.3.3 ファイルへ書き出し (DOM) 5.4 オリジナル CD 検索モードの処理 5.4.1 検索結果を表示 (SAX) 5.5 SAX イベントハンドラ 5.5.1 人気ランキングイベントハンドラ 5.5.2 オリジナル CD 検索イベントハンドラ parse メソッドで実行 図 5 プログラムの全体の流れ - 26 -

1: // クラスのインポートと引数のチェック 5.1 2: public class OriginalCDList { 3: 4: if (args[0].equals("-html")) { 5: // HTML 変換モードの処理 5.2 6: try { 7: // XML ファイル名の入力 8: // XSLT ファイル名の入力 9: // HTML ファイル名の入力 10: // XSLT 変換およびファイルへ書き出し 5.2.1 11: } catch (Exception e) { 12: // 例外処理 13: } 14: } 15: else if (args[0].equals("-ranking")) { 16: // 人気ランキングモードの処理 5.3 17: try { 18: // XML 入力ファイル名の入力 19: // XML 出力ファイル名の入力 20: // ランキングの一覧を取得 (SAX) 5.3.1 21: parser.parse(new File(xml1), new RankingHandler(arr_ranking)); 22: // ランキングを多い順番にソート 23: // XML の作成 (DOM) 5.3.2 24: // ファイルへ書き出し (DOM) 5.3.3 25: } catch (Exception e) { 26: // 例外処理 27: } 28: } 29: else if (args[0].equals("-search")) { 30: // オリジナル CD 検索モードの処理 5.4 31: try { 32: // XML ファイル名の入力 33: // 曲名の入力 34: // 検索結果を表示 (SAX) 5.4.1 35: parser.parse(new File(xml), new SearchHandler(str)); 36: } catch (Exception e) { 37: // 例外処理 38: } 39: } - 27 - 第 2 部 CD 製作会社のマーケティング調査

40: 41: } 42: 43: // 人気ランキングイベントハンドラ (SAX) 5.5.1 44: class RankingHandler extends DefaultHandler { 45: } 46: 47: // オリジナル CD 検索イベントハンドラ (SAX) 5.5.2 48: class SearchHandler extends DefaultHandler { 49: } - 28 -

5. プログラムの詳細説明 ここからは Java による CD アルバムデータを表示するプログラムの作成です それで は プログラムを順番に作成していきます 5.1 クラスのインポートと引数のチェック まず 必要なクラスをインポートします その後 メインプログラムで引数のチェック をし 入力 編集のそれぞれのモードの処理をします 1: import java.io.*; 2: import java.text.*; 3: import java.util.*; 4: import javax.xml.parsers.*; 5: import javax.xml.transform.*; 6: import javax.xml.transform.dom.*; 7: import javax.xml.transform.stream.*; 8: import org.w3c.dom.*; 9: import org.xml.sax.*; 10: import org.xml.sax.helpers.*; DOM と SAX を使用しますので javax.xml.parsers.* 以下 7 行をインポートします XSLT の処理は主に javax.xml.transform.* を使用します 13: class Ranking { 14: // Artist 属性値を保存する文字列 15: String artist; 16: // Title 属性値を保存する文字列 17: String title; 18: // Time 属性値を保存する文字列 19: String time; 20: // 出現回数を保存する変数 21: int num; 22: } 人気ランキングモードでランキングデータを保存するクラスを定義します - 29 - 第 2 部 CD 製作会社のマーケティング調査

25: class RankingComparator implements Comparator { 26: public int compare(object o1, Object o2) { 27: return (((Ranking)o2).num - ((Ranking)o1).num); 28: } 29: } 人気ランキングモードでランキングデータをソートするコールバック関数です ランキングの人数によって比較を行います Comparator インターフェースは ソートメソッド (Collections クラスの sort メソッド等 ) の引数として使用 (138 行目 ) することによって リストの順序付けを行うことのできる比較関数となります 通常は 最初の引数が2 番目の引数より小さい場合を負の整数とし 両方が等しい場合を0 最初の引数が2 番目の引数より大きい場合を正の整数とすることによってリストを昇順に並べることができますが ここでは num の値が大きい順番 ( 降順 ) に並べますので 通常と逆の比較になります 尚 引数には Ranking クラスが渡されますので Ranking クラスで型変換を行った後 Ranking クラスの変数 num の値を比較しています 32: public class OriginalCDList { 33: public static void main(string[] args) { 34: 35: // 引数のチェック 36: if (args.length!= 1) { 37: // 引数が1 個以外の場合はメッセージを出力して終了 38: System.out.println(" 引数を入力してください "); 39: System.out.println(" -html : HTML 変換 "); 40: System.out.println(" -ranking : 人気ランキング "); 41: System.out.println(" -search : オリジナル CD 検索 "); 42: return; 43: } 44: 45: // BufferedReader オブジェクトの作成 46: BufferedReader br = 47: new BufferedReader(new InputStreamReader(System.in)); CDAlbumList というクラス名でプログラムを作成します 最初に引数のチェックをします 今回は - html が HTML 変換の場合のパラメータ -ranking が人気ランキングの場合のパラメータ -search がオリジナル CD 検索の場 合のパラメータとします 次にコマンドラインから文字を入力する準備として BufferedReader オブジェクトを用 意しておきます - 30 -

49: if (args[0].equals("-html")) { 50: // ここから HTML 変換モードの処理 51: try { // ファイルへ書き出し 5.2.1 95: } catch (Exception e) { 96: // 例外処理 ( スタックトレースの出力 ) 97: e.printstacktrace(); 98: } 99: } 100: 101: else if (args[0].equals("-ranking")) { 102: // ここから人気ランキングモードの処理 103: try { // ランキングの一覧を取得 5.3.1 // XML の作成 5.3.2 // ファイルへ書き出し 5.3.3 189: } catch (Exception e) { 190: // 例外処理 ( スタックトレースの出力 ) 191: e.printstacktrace(); 192: } 193: } 194: 195: else if (args[0].equals("-search")) { 196: // ここからオリジナル CD 検索モードの処理 197: try { // 検索結果を表示 5.4.1 227: } catch (Exception e) { 228: // 例外処理 ( スタックトレースの出力 ) 229: e.printstacktrace(); 230: } 231: } コマンドラインパラメータが -html (HTML 変換モード ) の場合 - ranking ( 人気 ランキングモード ) の場合 - search ( オリジナル CD 検索モード ) の場合で処理を分け ます - 31 - 第 2 部 CD 製作会社のマーケティング調査

5.2 HTML 変換モードの処理 最初は HTML 変換モードの処理です コマンドラインからファイル名の入力を行い その内容にしたがって XSLT 変換を行い ファイルへ書き出します 5.2.1 XSLT 変換およびファイルへ書き出し 1 XML ファイル名 XSLT ファイル名 HTML ファイル名の入力 59: // XML ファイル名の入力 60: for ( ; ; ) { 61: System.out.println( 62: ">>> XML ファイル名 ( 入力ソース )"); 63: xml = br.readline(); 64: if (!xml.equals("")) break; 65: } 66: 67: // XSLT ファイル名の入力 68: for ( ; ; ) { 69: System.out.println( 70: ">>> XSLT ファイル名 ( スタイルシート )"); 71: xslt = br.readline(); 72: if (!xslt.equals("")) break; 73: } 74: 75: // HTML ファイル名の入力 76: for ( ; ; ) { 77: System.out.println( 78: ">>> HTML ファイル名 ( 出力ファイル )"); 79: html = br.readline(); 80: if (!html.equals("")) break; 81: } 最初に XML ファイル名 XSLT ファイル名 HTML ファイル名を入力します - 32 -

2 TransformerFactory, Transformer オブジェクトの作成 85: TransformerFactory tf = TransformerFactory.newInstance(); TransformerFactory オブジェクトを生成します 87: Transformer t = tf.newtransformer(new StreamSource(xslt)); 89: t.setoutputproperty("encoding", "Shift_JIS"); Transformer オブジェクトを生成します これまで newtransformer メソッドの引数には何も指定していませんでしたが XSLT で変換する場合には XSLT ファイルを指定します そして 文字エンコーディング方式の設定を行います HTML 出力の場合 インデントの設定はしなくてもある程度見やすい状態で出力されますので インデントの設定は行っていません 3 書き出し 91: t.transform(new StreamSource(xml), 92: new StreamResult(new File(html))); XML ファイルを指定して HTML ファイルに出力します - 33 - 第 2 部 CD 製作会社のマーケティング調査

5.3 人気ランキングモードの処理 次に 人気ランキングモードの処理です SAX を使用してランキングの一覧を取得し DOM を使用して XML の作成とファイルへの書き出しを行います 書き出されたファイル を使用して HTML 変換モードの処理を行い HTML に出力します 5.3.1 ランキングの一覧を取得 1 XML 入力ファイル名 XML 出力ファイル名の入力 111: // XML 入力ファイル名の入力 112: for ( ; ; ) { 113: System.out.println( 114: ">>> XML 入力ファイル名 "); 115: xml1 = br.readline(); 116: if (!xml1.equals("")) break; 117: } 118: 119: // XML 出力ファイル名の入力 120: for ( ; ; ) { 121: System.out.println( 122: ">>> XML 出力ファイル名 "); 123: xml2 = br.readline(); 124: if (!xml2.equals("")) break; 125: } 最初に XML 入力ファイル名 XML 出力ファイル名を入力します 2 SAXParserFactory, SAXParser オブジェクトの作成 131: SAXParserFactory spfactory = SAXParserFactory.newInstance(); 133: SAXParser parser = spfactory.newsaxparser(); SAXParserFactory オブジェクトと SAXParser オブジェクトを生成します - 34 -

3 ランキングの一覧を取得 135: parser.parse(new File(xml1), new RankingHandler(arr_ranking)); SAXParser オブジェクトの parse メソッドを使用して イベント処理を行います このメソッドを呼び出した時点で RankingHandler が実行されます RankingHandler では XML を順次読み込み Artist 属性 Title 属性 Artist 属性 その曲を選択した学生の人数を Ranking クラスに設定し コンストラクタの引数である変数 arr_ranking に保存します 4 ランキングを多い順番にソート 138: Collections.sort(arr_ranking, new RankingComparator()); Collections クラスの sort メソッドを使用して ランキングのソートを行います 1 番目の引数が ArrayList オブジェクト ( 実際には List オブジェクトですが ArrayList クラスは List クラスを継承していますから問題ありません ) で 2 番目の引数が先に作成したコールバック関数です - 35 - 第 2 部 CD 製作会社のマーケティング調査

5.3.2 XML の作成 1 DocumentBuilderFactory, DocumentBuilder オブジェクトの作成 142: DocumentBuilderFactory dbf = 143: DocumentBuilderFactory.newInstance(); 145: DocumentBuilder db = dbf.newdocumentbuilder(); DocumentBuilderFactory オブジェクトと DocumentBuilder オブジェクトを生成します 2 新規 Document の作成 147: DOMImplementation di = db.getdomimplementation(); 148: Document document = di.createdocument(null, "CDRanking", null); Document オブジェクトを生成します 3 CDRanking 要素の取得 150: Element root = (Element)document.getDocumentElement(); Document オブジェクトの getdocumentelement メソッドを使用して2で作成したルート要素 (CDRanking) のオブジェクトを取得します - 36 -

4 Rank 要素 Artist 要素 Title 要素 Time 要素 Num 要素の作成と追加 152: for (int i = 0; i < arr_ranking.size(); i++) { 153: // Rank 要素の作成 154: Element rank = (Element)document.createElement("Rank"); 155: root.appendchild(rank); 156: Ranking r = (Ranking)arr_ranking.get(i); 157: // Artist 要素の作成 158: Element artist = (Element)document.createElement("Artist"); 159: artist.appendchild(document.createtextnode(r.artist)); 160: rank.appendchild(artist); 161: // Title 要素の作成 162: Element title = (Element)document.createElement("Title"); 163: title.appendchild(document.createtextnode(r.title)); 164: rank.appendchild(title); 165: // Time 要素の作成 166: Element time = (Element)document.createElement("Time"); 167: time.appendchild(document.createtextnode(r.time)); 168: rank.appendchild(time); 169: // Num 要素の作成 170: Element num = (Element)document.createElement("Num"); 171: num.appendchild(document.createtextnode( 172: String.valueOf(r.num))); 173: rank.appendchild(num); 174: } 人気ランキングの曲数だけループ処理して Rank 要素 Artist 要素 Title 要素 Time 要素 Num 要素の作成と追加をします - 37 - 第 2 部 CD 製作会社のマーケティング調査

5.3.3 ファイルへ書き出し 1 TransformerFactory, Transformer オブジェクトの作成 178: TransformerFactory tf = TransformerFactory.newInstance(); TransformerFactory オブジェクトを生成します 180: Transformer t = tf.newtransformer(); 182: t.setoutputproperty("encoding", "Shift_JIS"); 183: t.setoutputproperty("indent", "yes"); Transformer オブジェクトを生成します 生成した Transformer の setoutputproperty を使用して文字エンコーディング方式とインデントの設定を行います 2 書き出し 185: t.transform(new DOMSource(document), 186: new StreamResult(xml2)); 作成した XML をファイルに書き出します - 38 -

5.4 オリジナル CD 検索モードの処理 次に オリジナル CD 検索モードの処理です SAX を使用してオリジナル CD を検索し ます 5.4.1 検索結果を表示 1 XML ファイル名 曲名の入力 203: // XML ファイル名の入力 204: for ( ; ; ) { 205: System.out.println( 206: ">>> XML ファイル名 "); 207: xml = br.readline(); 208: if (!xml.equals("")) break; 209: } 210: 211: // 曲名の入力 212: for ( ; ; ) { 213: System.out.println( 214: ">>> 曲名 "); 215: str = br.readline(); 216: if (!str.equals("")) break; 217: } 最初に XML ファイル名 曲名を入力します 2 SAXParserFactory, SAXParser オブジェクトの作成 222: SAXParserFactory spfactory = SAXParserFactory.newInstance(); 224: SAXParser parser = spfactory.newsaxparser(); SAXParserFactory オブジェクトと SAXParser オブジェクトを生成します 3 検索結果を表示 226: parser.parse(new File(xml), new SearchHandler(str)); SAXParser オブジェクトの parse メソッドを使用して イベント処理を行い その処理の中で結果を表示します このメソッドを呼び出した時点で SearchHandler が実行されます SearchHandler では XML を順次読み込み Title 属性から曲名で指定された文字列を検索し マッチした場合に Name 要素をコンソールに表示します - 39 - 第 2 部 CD 製作会社のマーケティング調査

5.5 SAX イベントハンドラ 最後に人気ランキングとオリジナル CD 検索の SAX イベントハンドラを作成します 5.5.1 人気ランキングイベントハンドラ 1 クラス定義 235: class RankingHandler extends DefaultHandler { 236: 237: // ランキングに関する情報を保存するリスト 238: private static ArrayList arr_ranking; 239: // Artist 属性値を保存する文字列 240: private String artist; 241: // Title 属性値を保存する文字列 242: private String title; 243: // Time 属性値を保存する文字列 244: private String time; 245: 246: RankingHandler(ArrayList arr) { 247: arr_ranking = arr; 248: } 人気ランキングイベントハンドラを RankingHandler という名称で作成します ArrayList を受け取るためにコンストラクタを定義しています 2 ドキュメント開始時 251: public void startdocument() { 252: arr_ranking.clear(); 253: } 受け取ったArrayList の全ての内容を削除します - 40 -

3 要素の開始タグ読み込み時 256: public void startelement(string uri, 257: String localname, 258: String qname, 259: Attributes attributes) { 260: if (qname.equals("music")) { 261: // Artist 属性を保存 262: artist = attributes.getvalue("artist"); 263: // Title 属性を保存 264: title = attributes.getvalue("title"); 265: // Time 属性を保存 266: time = attributes.getvalue("time"); 267: } 268: } Music 要素の処理をします 属性を検索し Title 属性と Time 属性の内容を保存しま す - 41 - 第 2 部 CD 製作会社のマーケティング調査

3 要素の終了タグ読み込み時 275: public void endelement(string uri, String localname, String qname) { 276: if (qname.equals("music")) { 277: Ranking r; 278: // リストの中を検索 279: for (int i = 0; i < arr_ranking.size(); i++) { 280: r = (Ranking)arr_ranking.get(i); 281: // リストの中に見付かった場合はカウントをインクリメント 282: if (r.title.equals(title)) { 283: r.num++; 284: return; 285: } 286: } 287: // リストの中に見付からない場合はリストに追加 288: r = new Ranking(); 289: r.artist = artist; 290: r.title = title; 291: r.time = time; 292: r.num = 1; 293: arr_ranking.add(r); 294: } 295: } Music 要素の処理をします ArrayList から曲名を検索して見付かった場合にはカウント をインクリメントします 見付からなかった場合には Title 属性と Time 属性とカウント1 を ArrayList に追加します - 42 -

5.5.2 オリジナル CD 検索イベントハンドラ 1 クラス定義 302: class SearchHandler extends DefaultHandler { 303: 304: // キーワードを保存する文字列 305: private String keyword; 306: // キーワードが見付かったかどうかを保存する変数 307: private boolean find; 308: // テキストデータを保存する文字列 309: private String text; 310: // Name 要素のデータを保存する文字列 311: private String name; 312: // Title 属性値を保存する文字列 313: private String title; 314: 315: SearchHandler(String s) { 316: keyword = s; 317: } オリジナル CD 検索イベントハンドラを SearchHandler という名称で作成します 検 索キーワードを受け取るためにコンストラクタを定義しています 2 要素の開始タグ読み込み時 324: public void startelement(string uri, 325: String localname, 326: String qname, 327: Attributes attributes) { 328: if (qname.equals("cd")) { 329: find = false; 330: } else if (qname.equals("music")) { 331: // Title 属性を保存 332: title = attributes.getvalue("title"); 333: } 334: text = ""; 335: } CD 要素の開始タグで検索結果フラグを false に設定しておきます Music 要素の開始 タグで属性を検索し Title 属性の内容を保存します - 43 - 第 2 部 CD 製作会社のマーケティング調査

3 テキストデータ読み込み時 338: public void characters(char[] ch, int offset, int length) { 339: text += new String(ch, offset, length); 340: } String クラスで文字列を取り出し テキストデータを保存しておきます 4 要素の終了タグ読み込み時 343: public void endelement(string uri, String localname, String qname) { 344: if (qname.equals("name")) { 345: // Name 要素を保存 346: name = text; 347: } else if (qname.equals("music")) { 348: // Title 属性からキーワードを検索 349: if (title.indexof(keyword)!= -1) find = true; 350: } else if (qname.equals("cd")) { 351: // キーワードが見付かった場合に表示 352: if (find) { 353: System.out.println(name); 354: } 355: } 356: } Name 要素の終了タグで先に保存した文字列を保存しておきます Music 要素の終了タ グでTitle 属性からキーワードを検索して見付かった場合には検索結果フラグを true にし ます CD 要素の終了タグで検索結果が true の場合 Name 要素の内容を表示します - 44 -

6. プログラムのコンパイルと実行 HTML 変換モードで使用する XSLT スタイルシートの作成 CD データ結合 XML (CDAlbumList.xml) HTML ファイル (CDAlbumList.html) HTML 変換モード プログラムを作成 (Java プログラミング ) プログラム実行 (Java による実行 ) オリジナル CD 検索モード オリジナルデータ結合 XML (OriginalCDList.xml) ランキングデータ XML (CDRanking.xml) 入力ランキングモード 最後に プログラムのコンパイルです J2SE バージョン 1.4 以降には XSLT,DOM,SAX の API が標準で含まれていますので 特にパッケージ等をインストールする必要なく コ ンパイルが可能です リスト 10 プログラムのコンパイル ( 太字はコマンド入力 ) C: java> javac CDAlbumList.java プログラムの実行は リスト 1 リスト 2 リスト 3 を参照してください - 45 - 第 2 部 CD 製作会社のマーケティング調査

7. コーディングリスト コーディングリストをリスト 11 に示します リスト11 CDAlbumList.java 1: import java.io.*; 2: import java.text.*; 3: import java.util.*; 4: import javax.xml.parsers.*; 5: import javax.xml.transform.*; 6: import javax.xml.transform.dom.*; 7: import javax.xml.transform.stream.*; 8: import org.w3c.dom.*; 9: import org.xml.sax.*; 10: import org.xml.sax.helpers.*; 11: 12: // ランキングのリストで使用するクラス 13: class Ranking { 14: // Artist 属性値を保存する文字列 15: String artist; 16: // Title 属性値を保存する文字列 17: String title; 18: // Time 属性値を保存する文字列 19: String time; 20: // 出現回数を保存する変数 21: int num; 22: } 23: 24: // ランキングのリストのソートで使用するコールバック 25: class RankingComparator implements Comparator { 26: public int compare(object o1, Object o2) { 27: return (((Ranking)o2).num - ((Ranking)o1).num); 28: } 29: } 30: 31: // メインプログラム 32: public class OriginalCDList { 33: public static void main(string[] args) { 34: 35: // 引数のチェック 36: if (args.length!= 1) { 37: // 引数が1 個以外の場合はメッセージを出力して終了 38: System.out.println(" 引数を入力してください "); 39: System.out.println(" -html : HTML 変換 "); 40: System.out.println(" -ranking : 人気ランキング "); 41: System.out.println(" -search : オリジナル CD 検索 "); 42: return; 43: } 44: 45: // BufferedReader オブジェクトの作成 46: BufferedReader br = 47: new BufferedReader(new InputStreamReader(System.in)); - 46 -

48: 49: if (args[0].equals("-html")) { 50: // ここから HTML 変換モードの処理 51: try { 52: // XML ファイル名を保存する文字列 53: String xml; 54: // XSLT ファイル名を保存する文字列 55: String xslt; 56: // HTML ファイル名を保存する文字列 57: String html; 58: 59: // XML ファイル名の入力 60: for ( ; ; ) { 61: System.out.println( 62: ">>> XML ファイル名 ( 入力ソース )"); 63: xml = br.readline(); 64: if (!xml.equals("")) break; 65: } 66: 67: // XSLT ファイル名の入力 68: for ( ; ; ) { 69: System.out.println( 70: ">>> XSLT ファイル名 ( スタイルシート )"); 71: xslt = br.readline(); 72: if (!xslt.equals("")) break; 73: } 74: 75: // HTML ファイル名の入力 76: for ( ; ; ) { 77: System.out.println( 78: ">>> HTML ファイル名 ( 出力ファイル )"); 79: html = br.readline(); 80: if (!html.equals("")) break; 81: } 82: 83: // HTML への書き出し 84: // TransformerFactory オブジェクトの作成 85: TransformerFactory tf = TransformerFactory.newInstance(); 86: // Transformer オブジェクトの作成 87: Transformer t = tf.newtransformer(new StreamSource(xslt)); 88: // 出力プロパティを指定 89: t.setoutputproperty("encoding", "Shift_JIS"); 90: // 書き出し 91: t.transform(new StreamSource(xml), 92: new StreamResult(new File(html))); 93: 94: System.out.println(" 出力しました "); 95: } catch (Exception e) { 96: // 例外処理 ( スタックトレースの出力 ) 97: e.printstacktrace(); 98: } 99: } 100: 101: else if (args[0].equals("-ranking")) { - 47 - 第 2 部 CD 製作会社のマーケティング調査

102: // ここから人気ランキングモードの処理 103: try { 104: // ランキングに関する情報を保存するリスト 105: ArrayList arr_ranking; 106: // XML 入力ファイル名を保存する文字列 107: String xml1; 108: // XML 出力ファイル名を保存する文字列 109: String xml2; 110: 111: // XML 入力ファイル名の入力 112: for ( ; ; ) { 113: System.out.println( 114: ">>> XML 入力ファイル名 "); 115: xml1 = br.readline(); 116: if (!xml1.equals("")) break; 117: } 118: 119: // XML 出力ファイル名の入力 120: for ( ; ; ) { 121: System.out.println( 122: ">>> XML 出力ファイル名 "); 123: xml2 = br.readline(); 124: if (!xml2.equals("")) break; 125: } 126: 127: // リストを初期化 128: arr_ranking = new ArrayList(); 129: 130: // SAXParserFactory オブジェクトの作成 131: SAXParserFactory spfactory = SAXParserFactory.newInstance(); 132: // SAXParser オブジェクトの作成 133: SAXParser parser = spfactory.newsaxparser(); 134: // RankingHandler でランキングの一覧を取得 135: parser.parse(new File(xml1), new RankingHandler(arr_ranking)); 136: 137: // ランキングを多い順番にソート 138: Collections.sort(arr_ranking, new RankingComparator()); 139: 140: // XML の作成 141: // DocumentBuilderFactory オブジェクトの作成 142: DocumentBuilderFactory dbf = 143: DocumentBuilderFactory.newInstance(); 144: // DocumentBuilder オブジェクトの作成 145: DocumentBuilder db = dbf.newdocumentbuilder(); 146: // 新規 Document の作成 147: DOMImplementation di = db.getdomimplementation(); 148: Document document = di.createdocument(null, "CDRanking", null); 149: // CDList 要素の取得 150: Element root = (Element)document.getDocumentElement(); 151: 152: for (int i = 0; i < arr_ranking.size(); i++) { 153: // Rank 要素の作成 154: Element rank = (Element)document.createElement("Rank"); 155: root.appendchild(rank); - 48 -

156: Ranking r = (Ranking)arr_ranking.get(i); 157: // Artist 要素の作成 158: Element artist = (Element)document.createElement("Artist"); 159: artist.appendchild(document.createtextnode(r.artist)); 160: rank.appendchild(artist); 161: // Title 要素の作成 162: Element title = (Element)document.createElement("Title"); 163: title.appendchild(document.createtextnode(r.title)); 164: rank.appendchild(title); 165: // Time 要素の作成 166: Element time = (Element)document.createElement("Time"); 167: time.appendchild(document.createtextnode(r.time)); 168: rank.appendchild(time); 169: // Num 要素の作成 170: Element num = (Element)document.createElement("Num"); 171: num.appendchild(document.createtextnode( 172: String.valueOf(r.num))); 173: rank.appendchild(num); 174: } 175: 176: // ファイルへ書き出し 177: // TransformerFactory オブジェクトの作成 178: TransformerFactory tf = TransformerFactory.newInstance(); 179: // Transformer オブジェクトの作成 180: Transformer t = tf.newtransformer(); 181: // 出力プロパティを指定 182: t.setoutputproperty("encoding", "Shift_JIS"); 183: t.setoutputproperty("indent", "yes"); 184: // 書き出し 185: t.transform(new DOMSource(document), 186: new StreamResult(xml2)); 187: 188: System.out.println(" 出力しました "); 189: } catch (Exception e) { 190: // 例外処理 ( スタックトレースの出力 ) 191: e.printstacktrace(); 192: } 193: } 194: 195: else if (args[0].equals("-search")) { 196: // ここからオリジナル CD 検索モードの処理 197: try { 198: // XML ファイル名を保存する文字列 199: String xml; 200: // 入力された内容を保存する文字列 201: String str; 202: 203: // XML ファイル名の入力 204: for ( ; ; ) { 205: System.out.println( 206: ">>> XML ファイル名 "); 207: xml = br.readline(); 208: if (!xml.equals("")) break; 209: } - 49 - 第 2 部 CD 製作会社のマーケティング調査

210: 211: // 曲名の入力 212: for ( ; ; ) { 213: System.out.println( 214: ">>> 曲名 "); 215: str = br.readline(); 216: if (!str.equals("")) break; 217: } 218: 219: System.out.println(""); 220: 221: // SAXParserFactory オブジェクトの作成 222: SAXParserFactory spfactory = SAXParserFactory.newInstance(); 223: // SAXParser オブジェクトの作成 224: SAXParser parser = spfactory.newsaxparser(); 225: // SearchHandler で検索結果を表示 226: parser.parse(new File(xml), new SearchHandler(str)); 227: } catch (Exception e) { 228: // 例外処理 ( スタックトレースの出力 ) 229: e.printstacktrace(); 230: } 231: } 232: } 233: } 234: 235: class RankingHandler extends DefaultHandler { 236: 237: // ランキングに関する情報を保存するリスト 238: private static ArrayList arr_ranking; 239: // Artist 属性値を保存する文字列 240: private String artist; 241: // Title 属性値を保存する文字列 242: private String title; 243: // Time 属性値を保存する文字列 244: private String time; 245: 246: RankingHandler(ArrayList arr) { 247: arr_ranking = arr; 248: } 249: 250: // ドキュメント開始時 251: public void startdocument() { 252: arr_ranking.clear(); 253: } 254: 255: // 要素の開始タグ読み込み時 256: public void startelement(string uri, 257: String localname, 258: String qname, 259: Attributes attributes) { 260: if (qname.equals("music")) { 261: // Artist 属性を保存 262: artist = attributes.getvalue("artist"); 263: // Title 属性を保存 - 50 -

264: title = attributes.getvalue("title"); 265: // Time 属性を保存 266: time = attributes.getvalue("time"); 267: } 268: } 269: 270: // テキストデータ読み込み時 271: public void characters(char[] ch, int offset, int length) { 272: } 273: 274: // 要素の終了タグ読み込み時 275: public void endelement(string uri, String localname, String qname) { 276: if (qname.equals("music")) { 277: Ranking r; 278: // リストの中を検索 279: for (int i = 0; i < arr_ranking.size(); i++) { 280: r = (Ranking)arr_ranking.get(i); 281: // リストの中に見付かった場合はカウントをインクリメント 282: if (r.title.equals(title)) { 283: r.num++; 284: return; 285: } 286: } 287: // リストの中に見付からない場合はリストに追加 288: r = new Ranking(); 289: r.artist = artist; 290: r.title = title; 291: r.time = time; 292: r.num = 1; 293: arr_ranking.add(r); 294: } 295: } 296: 297: // ドキュメント終了時 298: public void enddocument() { 299: } 300: } 301: 302: class SearchHandler extends DefaultHandler { 303: 304: // キーワードを保存する文字列 305: private String keyword; 306: // キーワードが見付かったかどうかを保存する変数 307: private boolean find; 308: // テキストデータを保存する文字列 309: private String text; 310: // Name 要素のデータを保存する文字列 311: private String name; 312: // Title 属性値を保存する文字列 313: private String title; 314: 315: SearchHandler(String s) { 316: keyword = s; 317: } - 51 - 第 2 部 CD 製作会社のマーケティング調査

318: 319: // ドキュメント開始時 320: public void startdocument() { 321: } 322: 323: // 要素の開始タグ読み込み時 324: public void startelement(string uri, 325: String localname, 326: String qname, 327: Attributes attributes) { 328: if (qname.equals("cd")) { 329: find = false; 330: } else if (qname.equals("music")) { 331: // Title 属性を保存 332: title = attributes.getvalue("title"); 333: } 334: text = ""; 335: } 336: 337: // テキストデータ読み込み時 338: public void characters(char[] ch, int offset, int length) { 339: text += new String(ch, offset, length); 340: } 341: 342: // 要素の終了タグ読み込み時 343: public void endelement(string uri, String localname, String qname) { 344: if (qname.equals("name")) { 345: // Name 要素を保存 346: name = text; 347: } else if (qname.equals("music")) { 348: // Title 属性からキーワードを検索 349: if (title.indexof(keyword)!= -1) find = true; 350: } else if (qname.equals("cd")) { 351: // キーワードが見付かった場合に表示 352: if (find) { 353: System.out.println(name); 354: } 355: } 356: } 357: 358: // ドキュメント終了時 359: public void enddocument() { 360: } 361: } - 52 -