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にしておけば、サーバーが不要で、どこでも必要な画像をみることができるからです。

error: コピーできません !!