日別アーカイブ: 2010年3月11日

2件の投稿

XSLT 2

XSLTのプログラムに手こずっています。

話を簡単にしますと、団地の不具合箇所の写真があります。
各写真に対応して、[号棟]、[部位]、[工事区分]、[写真URL]および[コメント]タグをもったXMLデータを作成します。

たとえば、ある写真に[2号棟]、部位:[外壁]、[修理]要、[pic101.jpg]、[外壁タイルにひびが入っています]という具合です。
WEBのページでは、例えば次のようなコントロールがあって、ユーザがコンボから号棟、チェックボックスで部位、工事区分を選択し、サブミットすると該当する画像をコメント付きで表示したいのです。

xsltInVals2

やるべき仕事は、「XMLデータファイルから、[2号棟]の写真で(かつ)、外壁か屋上か修理か塗装]に関する写真を表示せよ」というものです。

これを仮にDBのSQLで書くと次のようなものです。

Select * From 画像テーブル Where 号棟 = 2 And (外壁 = True Or 屋上= True Or 修理 = True Or 塗装 = True)

このデータの抽出と画面の作成をXSLTでやりたいのです。
データの抽出でいえば、SQLのWhere区を作成したいのですが、これがうまくいきません。
XLSTをよく知る人は簡単な話なのかもしれませんが、素人の私にはよく分かりません。
XPathで次のように書ければ話は簡単ですが、そうはいきません。

<xsl:template match="/画像[号棟 = '2' And (外壁 = 'True' Or 屋上= 'True' Or 修理 = 'True' Or 塗装 =' True')]">
  <xsl:call-templates name="Display"/>
 </xsl:template>

ここには二つの問題があります。
まず、[号棟 = ‘2’ … ]のようにXPATHに二つ以上の条件を書くことができないこと。
つぎにこのような条件をダイナミックに書くことができないことです(多分)。

SQLは文字列ですので、データベースに送信するまでにダイナミックにSQLを作成することができますが、
XSLTではそのような方法はないと思います。

私が苦心の末たどり着いた方法は次のようなものです。

メインテンプレート
すべての画像データに次の処理をする。
1. 検索条件に号棟が記入されているかどうかしらべる。
1.1 号棟の指定がある。
1.1.1. もし画像の号棟が指定の号棟に符合すれば、[外壁][屋上][修理]等の検索条件の値をパラメータとして[工事テンプレート]をコールする。
1.1.2. 符合しなければ、終わり。
1.2 号棟の指定がなければ、[外壁][屋上][修理]等の検索条件の値をパラメータとして[工事テンプレート]をコールする。

工事テンプレート
1. [外壁]パラメータがtrueなら、次の処理をする。falseなら2.の処理をする。
1.1 画像データで[外壁]タグがtrueなら、[表示テンプレート]をコールして終わり。
1.2. falseなら、[外壁]パラメータをfalseにし、[屋上][修理]パラメータをそのままにして、[工事テンプレート]をコールする。
注。この画像は他の条件に符号するかもしれないので、再度[工事テンプレート]をコールするが、[外壁]パラメータは検査済みにしなければいけない。
2. [屋上]パラメータがtrueなら、次の処理をする。falseなら3.の処理をする。
2.1 画像データで[屋上]タグがtrueなら、[表示テンプレート]をコールして終わり。
2.2. falseなら、[屋上]パラメータをfalseにし、[修理]パラメータをそのままにして、[工事テンプレート]をコールする。
3. 以下は同様の処理をします。

注。このテンプレートの主旨は、ある画像を表示するかどうかは、
最初の検索条件を調べ、条件に符合すればこの画像を表示し他の条件をチェックしない。
当該条件に符合しなければ次の条件をチェックし、条件に符合すればこの画像を表示し他の条件をチェックしない。
すべての条件に符合しなければ、この画像は表示しない。ということです。
XSLTでは、ループから抜けるための[exit for]のような仕組みがないので、リカーシブコール(再帰呼び出し)を使うしかないと思います。

表示テンプレート
表示テンプレートはHTMLのTableタグの該当する列に、画像の号棟名や画像そのものやコメントを転記するものです。

XMLおよびXSLTファイルができれば、条件入力用のHTMLファイルを作成し、上のコントロールを配置、表示すべき列等にID(例えば[targetID])を付けて、JavascriptでXSLT変換をし、その結果をターゲットの[innerHTML]に出力すれば望みの画像を表示することができます。

var HTMLtarget = document.all[targetID];
HTMLtarget.innerHTML = XSLProcessor.output;

ところで、なぜ簡単に処理できるデータベースではなく、XSLTにこだわるのかといえば、JavascriptとXML、XSLTにしておけば、サーバーが不要で、どこでも必要な画像をみることができるからです。

ブログ1年

ブログを始めて、1年経過しました。
最初はso-netで、「どうせ長続きはしないだろう」と思って気楽に始めました。

so-netではブログの人気ランキングが出ます。
これをオフにもできるのですが、やはりこのランキングが気になります。
ランキングが上がれば「よかった」と思い、下がればがっかりします。
ランキングの上下を気にするのは本末転倒のような気がしてきて、結局so-netを引き上げました。

so-netでは、書いている人間がどこの誰かも分からないし、日常的なことも、孫のことも書いていました。
が、今のサイトを使うようになって、仕事のことを原則にして続けてきました。

余談ですが、先日このブログに孫の写真を出していたら、「やめてくれ。誘拐でもされたらどうする」と息子夫婦にいわれて、
「どうしてこの子の居所がわかるのだ」と思いましたが、親がいうので取り下げました。
(後日孫は大きくなったので、小さいときの写真は誰だかわからないだろう。と当時の写真を載せています)

このブログでは、読者からの投稿等コミュニケートの手段を原則ストップしています。
ここに掲載している私のコードも完全とは思っていないし、色々なご意見もいただきたいのですが、
いたずらが嫌なことと、投稿を気にしてそのことに左右されるとまた本末転倒になると思うからです。

つたないブログに毎日100人近くの人がアクセスしてくださっています。
感謝しますと同時に、これまでの形でのブログはいつまでも続かないと思いますので、
皆様にもなんらかの参加ができるようなことも考えたいと思っています。