- PR -

xslを動的に変更することは出来ますか?

1
投稿者投稿内容
ADO15
会議室デビュー日: 2004/07/08
投稿数: 7
投稿日時: 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個作るわけにも行きませんので。
どなたか教えてください。よろしくお願い致します。
fofofo
会議室デビュー日: 2003/01/06
投稿数: 8
お住まい・勤務地: 大阪
投稿日時: 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の値を
渡してあげないと駄目ですけどね。
そのやり方は環境毎に色々です。

ADO15
会議室デビュー日: 2004/07/08
投稿数: 7
投稿日時: 2004-07-08 21:15
fofofoさん 早々のお返事ありがとうございました。

そういわれてみると、環境毎にいろいろやり方がありそうです。
で、知りたいのはjavascriptでの変数引渡しです。
クライアントサイドでも十分動作が可能なことをしたいのです。

xsltソースの中にはjavascriptを埋め込むことが出来ると思うので、
この中で、例えば、
・今日の日付をjavascriptで拾ってきて変数として引き渡す

・formに日付を入れるか指定のボタンを作っておいて変数を渡す
等がしたいのです。

いろいろ試したところでは、
javascriptで取得した数値については<script>タグの中に入っていて、
その後に続くxsltソースの中で変数として上手く使うことが出来ないのです。

何かうまい方法は無いでしょうか?
fofofo
会議室デビュー日: 2003/01/06
投稿数: 8
お住まい・勤務地: 大阪
投稿日時: 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内で日付を取得して比較させてしまうのもありでしょうか。
井上孝司
ぬし
会議室デビュー日: 2001/09/08
投稿数: 668
お住まい・勤務地: 東京都
投稿日時: 2004-07-08 22:32
井上です。

MSXML を使うのであれば、<msxml:script> タグを使って VBScript、あるいは JavaScript で日付の値を返す独自の関数を作って、戻り値を XSLT の中にはめ込んであげる、という手も使えると思います。ただし、MSXML でないと実行できなくなってしまいますが。

実はこれ、私のサイトのトップページで "Last Update" の日付を自動的に入れるために使っている方法です。
_________________
www.kojii.net
ADO15
会議室デビュー日: 2004/07/08
投稿数: 7
投稿日時: 2004-07-10 21:24
fofofo さん 井上さん

早々のお返事ありがとうございました。
パーサーの確認などに手間取り、動作確認ができない状態でした。
とりあえずは、連載記事のソースを使ってみて、
更なる拡張の段階で独自関数の作成などにもチャレンジします。

今回のように
スタイルシートでひとつのデータを抜き出す上で
何とかxsl自体を可変にしたいと思っていました。
たとえば、
今回のような毎日の格言を出力させるとか
数百人規模の名簿から、特定人物の住所・名前などを出力させるなど
いろいろなことに使いたいと思います。
元となるxmlが大きいと重くなるのが少し嫌ですが、
主たる目的はxmlになじむことなので、今のところは大きな問題ではありません。

ありがとうございました。
1

スキルアップ/キャリアアップ(JOB@IT)