- ベストアンサー
xsl内の変数計算方法とパラメータ取得方法
- xsl+xml+cssを使い、1ページに一定数の画像を表示させ、ページングさせるxslを作成しています。
- 変数の計算方法についてと、urlのパラメータを取得する方法について質問があります。
- 変数の計算方法は正しく記述されていないようで、エラーが表示されています。また、urlのパラメータを取得する方法もわかりません。
- みんなの回答 (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要素の内容も指定しよう
その他の回答 (1)
- himajin100000
- ベストアンサー率54% (1660/3060)
補足要求 「XML」と「(動く動かざるを問わずとりあえず書いて見た)XSLT」と「希望する結果」がわかる小さなサンプルが欲しい。 言葉の説明じゃなくて。 #感覚的には変数の再定義ではなく(できるかわからんのでやったことねーや) 再帰用のテンプレート作ることで対応するような気がする
補足
(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>
お礼
いろいろご指摘ありがとうございます。 一人で煮詰まっていたので、精神的に楽になりました。 分からない言葉も多いので、 調べながらご指摘いただいた部分を修正していこうと思います。 xsltでページング機能を実現できるように もう少し試行錯誤してみます。