質問 |
||
| QNo.4172975 | xsl内の変数計算方法とパラメータ取得方法 | |
|---|---|---|
| 質問者:pine_88 |
xsl+xml+cssを使い、1ページに一定数の画像を表示させ、 ページングさせるxslを作っています。 わからないことは (1)変数の計算方法について ページの先頭表示データを以下のように定義しました。 <xsl:variable name="TopData" select="1" /> nextボタン押し下げ時に1ページ先の先頭表示データを以下のように計算したいのですが、 <xsl:variable name="TopData" select="$TopData=$TopData+$PageData" /> 画面にfalseと表示されてしまいました。 また、backボタン押し下げ時に1ページ前の先頭表示データを以下のように計算したのですが、 ブラウザにエラーが表示されてしまいました。 <xsl:variable name="TopData" select="$TopData=$TopData-$Page" /> (2)urlのパラメータを取得する方法について nextボタンを以下のように記述しました。 <a href="photo.xml?TopData={$TopData}"> <img width="30" height="30" src="img/aaa.gif" /> </a> ここで与えたパラメータを、同じxlstファイルで取得し、 値を使うにはどのように記述したらよろしいでしょうか? ご教授おねがいいたします。 |
|
困り度:
|
||
| 質問投稿日時: 08/07/13 12:31 |
||
回答良回答20pt |
|
| ANo.2 | ちょっとメモ。 1. 何やりたいかはわかった。再帰全く関係ねー。 多分XMLとXSLTだけでは完結せず。他の言語によるプログラムで XSLTプロセッサに引数を渡すさないと無理っぽい(諦めろってこと) で,他の言語でやることになるなら xsl:templateの変数ではなく xsl:stylesheetの最初の子要素として <xsl:param name="TopData" select="1" /> を配置する(実際に試してみてはいない) 2.【オマケ】 文法ミス多すぎ。 CDATAに書いたものは単なるテキストノードになるだけ。XSLTの要素にはならないよ、当然。 #XSLTの変数はJavaとかで言うfinalって言えばわかる? そもそも元のxmlファイルが整形式ではない ×<?xml:stylesheet type="text/xsl" href="hoge.xsl"?> ○<?xml-stylesheet type="text/xsl" href="hoge.xsl"?> 比較演算子が実体参照に直されてないためにXSLTスタイルシートそのものが整形式エラーを出してた。 xsl:attribute直下に何で要素が配置されてるんだよ xsl:sort のselect属性のpnoは@pnoの誤り #俺も知らなかった concat関数の引数はattribute value templateではないようで, {}で括るとエラーにされた・・・ので string($TopData+$PageData) とすることで切り抜けた。 s要素にマッチするテンプレートで出力される img要素やdiv要素は「XHTMLの名前空間の要素」ではなく「名前空間なしの要素」なので注意 個人的には【xsl:stylesheet要素】に「デフォルト名前空間はXHTMLの名前空間である」っていう名前空間宣言をつけとくのがいいと思う。 XHTMLの名前空間のimg要素はalt属性必須です。 XHTMLの名前空間のa要素の内容も指定しよう |
|---|---|
| 回答者:himajin100000 | |
| 種類:アドバイス どんな人:一般人 自信:参考意見 |
|
| 回答日時: 08/07/15 06:36 |
|
| |
| この回答へのお礼 | いろいろご指摘ありがとうございます。 一人で煮詰まっていたので、精神的に楽になりました。 分からない言葉も多いので、 調べながらご指摘いただいた部分を修正していこうと思います。 xsltでページング機能を実現できるように もう少し試行錯誤してみます。 |
回答 |
|
| ANo.1 | 補足要求 「XML」と「(動く動かざるを問わずとりあえず書いて見た)XSLT」と「希望する結果」がわかる小さなサンプルが欲しい。 言葉の説明じゃなくて。 #感覚的には変数の再定義ではなく(できるかわからんのでやったことねーや) 再帰用のテンプレート作ることで対応するような気がする |
|---|---|
| 回答者:himajin100000 | |
| 種類:補足要求 どんな人:一般人 自信:参考意見 |
|
| 回答日時: 08/07/13 12:59 |
|
| |
| この回答への補足 | (1)ご指摘とおり再帰用のテンプレートを使ったサイトを見つけることができましたので、動作確認してみます。 (2)JavaScriptのlocation.searchでパラメータをとることができるようなのですが、その値をxslの変数に渡す方法がまだわかりません。 以下長いですが、xsltファイルを貼り付けます。 <?xml version="1.0" encoding="Shift_JIS"?> <xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0"> <xsl:template match="/"> <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="ja"> <head> <link rel="stylesheet" href="common.css" type="text/css" media="screen" /> <link rel="stylesheet" type="text/css" href="contents.css" /> <script type="text/javascript" src="js/test.js"></script> </head> <body class="c"> <div id="contents"> <xsl:apply-templates /> </div> </body> </html> </xsl:template> <xsl:template match="s"> <xsl:comment>定数</xsl:comment> <xsl:variable name="MaxData" select="count(photo)" /> <xsl:variable name="PageData" select="8" /> <xsl:variable name="TopData" select="1" /> <script type="text/javascript"> <![CDATA[ document.write('<xsl:variable name="TopData" select="' + getParamValue()'" />'); ]]> </script> MaxData : <xsl:value-of select="$MaxData" /><br /> PageData : <xsl:value-of select="$PageData" /><br /> TopData : <xsl:value-of select="$TopData" /><br /> <xsl:for-each select="photo"> <xsl:sort select="pno" data-type="number" order="ascending" /> <xsl:choose> <xsl:when test="@pno < $TopData"> </xsl:when> <xsl:when test="$TopData + $PageData -1 < @pno"> </xsl:when> <xsl:otherwise> <xsl:if test="(@pno mod 2) = 1"> <div id="c_leftbox"> <div id="c_gif"> <img width="298" height="198" > <xsl:attribute name="src"> <xsl:value-of select="image" /> </xsl:attribute> </img> </div> <div id="c_memo"> <xsl:value-of select="memo" /> </div> </div> </xsl:if> <xsl:if test="(@pno mod 2) = 0"> <div id="c_rightbox"> <div id="c_gif"> <img width="298" height="198" > <xsl:attribute name="src"> <xsl:value-of select="image" /> </xsl:attribute> </img> </div> <div id="c_memo"> <xsl:value-of select="memo" /> </div> </div> </xsl:if> </xsl:otherwise> </xsl:choose> </xsl:for-each> <div id="c_leftyaji"> <xsl:choose> <xsl:when test="1 < $TopData"> <xsl:comment>コメント </xsl:comment> </xsl:when> <xsl:otherwise> <img width="30" height="30" src="img/noyaji.gif" /> </xsl:otherwise> </xsl:choose> </div> <div id="c_rightyaji"> <xsl:choose> <xsl:when test="$TopData + $PageData -1 < $MaxData"> <xsl:comment>コメント </xsl:comment> <xsl:element name="a"> <xsl:attribute name="href"> <xsl:value-of select="concat('photo.xml?TopData=',{$TopData}+{$PageData})" /> <img width="30" height="30" src="img/back.gif" /> </xsl:attribute> </xsl:element> </xsl:when> <xsl:otherwise> <img width="30" height="30" src="img/noyaji.gif" /> </xsl:otherwise> </xsl:choose> </div> </xsl:template> </xsl:stylesheet> 以下、XMLです。 <?xml version="1.0" encoding="Shift_JIS" ?> <?xml:stylesheet type="text/xsl" href="contents.xsl" ?> <s> <photo pno="1"> <image>img/a.jpg</image> <memo>memo1</memo> </photo> <photo pno="2"> <image>img/a.jpg</image> <memo>memo2</memo> </photo> <photo pno="3"> <image>img/a.jpg</image> <memo>memo3</memo> </photo> <photo pno="4"> <image>img/a.jpg</image> <memo>memo4</memo> </photo> </photo> </s> |
| この回答へのお礼 | この回答にお礼をつける(質問者のみ) |