プロが教える店舗&オフィスのセキュリティ対策術

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ファイルで取得し、
 値を使うにはどのように記述したらよろしいでしょうか?

ご教授おねがいいたします。

A 回答 (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要素の内容も指定しよう
    • good
    • 0
この回答へのお礼

いろいろご指摘ありがとうございます。
一人で煮詰まっていたので、精神的に楽になりました。
分からない言葉も多いので、
調べながらご指摘いただいた部分を修正していこうと思います。

xsltでページング機能を実現できるように
もう少し試行錯誤してみます。

お礼日時:2008/07/15 09:20

補足要求



「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>

補足日時:2008/07/14 23:58
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!