- - PR -
xslを動的に変更することは出来ますか?
1
投稿者 | 投稿内容 |
---|---|
|
投稿日時: 2004-07-08 14:13
xslを勉強中のものです。
日ごとに格言などをxmlに保存しておいて、 xslで当日部分のみを出力したいのですが、 ”動的に当日を指定する”方法がわかりません。 --------想定するxml -------------- <?xml version='1.0' encoding='SHIFT-JIS' ?> <kakugen> <data month="1" day="1">いそがば、まわれ</data> <data month="1" day="2">馬の耳に念仏</data> .... </kakugen> これに対して、固定のxslを作ることは問題ないのですが、 --------xsl ---------------------- <?xml version='1.0' encoding='SHIFT-JIS' ?> <xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0" > <xsl:output method="html" indent="yes"/> <xsl:template match="/"> <HTML><HEAD></HEAD><BODY> <xsl:apply-templates select="/kakugen/data[@month='1' @day='2']"/> ---@ </BODY></HTML> </xsl:template> <xsl:template match="data"> </xsl:template> </xsl:stylesheet> @の行を何とか動的に変更させてhtmlを出力することは出来ないでしょうか? まさか、スタイルシートを366個作るわけにも行きませんので。 どなたか教えてください。よろしくお願い致します。 |
|
投稿日時: 2004-07-08 20:17
こんばんわ。
ADO15さんのように、述部で条件分岐させるのであれば、 こんな感じでしょうか? -- <?xml version='1.0' encoding='SHIFT-JIS'?> <xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0"> <xsl:param name="month" /> <xsl:param name="day" /> <xsl:template match="/"> <xsl:apply-templates select="/kakugen/data[@month=$month and @day=$day]"/> </xsl:template> <xsl:template match="data"> <xsl:value-of select="." /> </xsl:template> </xsl:stylesheet> -- 当然ながら、判定用に「当日」をあらわすmonthとdayの値を 渡してあげないと駄目ですけどね。 そのやり方は環境毎に色々です。 |
|
投稿日時: 2004-07-08 21:15
fofofoさん 早々のお返事ありがとうございました。
そういわれてみると、環境毎にいろいろやり方がありそうです。 で、知りたいのはjavascriptでの変数引渡しです。 クライアントサイドでも十分動作が可能なことをしたいのです。 xsltソースの中にはjavascriptを埋め込むことが出来ると思うので、 この中で、例えば、 ・今日の日付をjavascriptで拾ってきて変数として引き渡す や ・formに日付を入れるか指定のボタンを作っておいて変数を渡す 等がしたいのです。 いろいろ試したところでは、 javascriptで取得した数値については<script>タグの中に入っていて、 その後に続くxsltソースの中で変数として上手く使うことが出来ないのです。 何かうまい方法は無いでしょうか? |
|
投稿日時: 2004-07-08 22:25
続けてこんばんわ。
JavaScriptだと思いつくのはこんなところですね。 勉強がてら作ってみました。こんな感じでどうでしょう? XSLは前のやつを使ってます。 -- <html> <head> <script> this.onload = loadData; function loadData() { //-- XSLドキュメントの読み込み --// var xslDoc = new ActiveXObject("Msxml2.FreeThreadedDOMDocument.4.0"); xslDoc.load("kakugen.xsl"); //-- XSLプロセッサの生成 --// var xsltTemp = new ActiveXObject("Msxml2.XSLTemplate.4.0"); xsltTemp.stylesheet = xslDoc; // XSLTスタイルシート設定 var xslProc = xsltTemp.createProcessor(); //-- XMLドキュメントの読み込み --// var xmlDoc = new ActiveXObject("Msxml2.DOMDocument.4.0"); xmlDoc.load("kakugen.xml"); //-- 変換処理 --// xslProc.input = xmlDoc; xslProc.addParameter("month", 1); // 月の設定 xslProc.addParameter("day", 2) // 日の設定 xslProc.transform(); //-- 表示処理 --// document.body.innerHTML = xslProc.output; } </script> </head> <body> </body> <script language="JavaScript"> <!-- window.open = SymRealWinOpen; //--> </script> </html> -- ちなみにパーサーはMSXML4を使っています。 この他、 http://www.atmarkit.co.jp/fxml/tanpatsu/10xslt/xslt07.html で紹介されているような拡張方法を使って、param要素を使って外部から値を渡す のではなく、XSLT内で日付を取得して比較させてしまうのもありでしょうか。 |
|
投稿日時: 2004-07-08 22:32
井上です。
MSXML を使うのであれば、<msxml:script> タグを使って VBScript、あるいは JavaScript で日付の値を返す独自の関数を作って、戻り値を XSLT の中にはめ込んであげる、という手も使えると思います。ただし、MSXML でないと実行できなくなってしまいますが。 実はこれ、私のサイトのトップページで "Last Update" の日付を自動的に入れるために使っている方法です。 _________________ www.kojii.net |
|
投稿日時: 2004-07-10 21:24
fofofo さん 井上さん
早々のお返事ありがとうございました。 パーサーの確認などに手間取り、動作確認ができない状態でした。 とりあえずは、連載記事のソースを使ってみて、 更なる拡張の段階で独自関数の作成などにもチャレンジします。 今回のように スタイルシートでひとつのデータを抜き出す上で 何とかxsl自体を可変にしたいと思っていました。 たとえば、 今回のような毎日の格言を出力させるとか 数百人規模の名簿から、特定人物の住所・名前などを出力させるなど いろいろなことに使いたいと思います。 元となるxmlが大きいと重くなるのが少し嫌ですが、 主たる目的はxmlになじむことなので、今のところは大きな問題ではありません。 ありがとうございました。 |
1