ファイルメーカーProのページへ戻る
JavaScriptで、表示範囲を動的に変化させる(ステップ)
<xsl:if expr="getpos(1)">を動的に変化させる
1〜5件目までを表示するXSLができました。前項のXSLにおいてif(pos >= spos && pos <= epos)
の部分が、表示範囲を決定する重要な部分であることがわかります。sposやeposは、getpos( )関数を呼び出すときの引数によって決まるので、この数字を書き変えれば、表示範囲も変化するはずです。
<xsl:if expr="getpos(1)">を書き変えるJavaScript |
function gonextp(spos) {
var key = document.XSLDocument.selectSingleNode("*/xsl:template[@match='ROW']/xsl:if/@expr");
key.value = "getpos(" + spos + ")";
var d = document.XMLDocument.selectSingleNode("FMPXMLRESULT/RESULTSET");
content.innerHTML = d.transformNode(document.XSLDocument);
}
|
- 1行目:
- getpos(1)を書き変えるためのgonextp( )関数を定義します。
- 2行目:
-
document.XSLDocument.selectSingleNode
は、「現在の文書中の.XSL文書中の.とある1要素」を取り出す命令。「とある1要素」は、その後ろのパターンマッチングで定義されていて、「match属性が'ROW'であるxsl:template要素の子要素のxsl:if要素のexpr属性」に該当する部分、つまりexpr="getpos(1)"
です。これが、keyという変数に代入されます。
- 3行目:
-
expr="getpos(1)"
を書き変える命令です。gonextp( )関数の実行時に一緒に渡される数値sposを使って、新しいexpr属性値を作って、それをkeyの値と置き換えています。たとえば、gonextp(6)が実行されれば、sposは6なので、expr="getpos(1)"
はexpr="getpos(6)"
に書き変えられます。
- 4〜5行目:
- expr属性値を書き換えた結果を、画面に反映するために、XMLデータのRESULTSET要素以下の部分を取り出して、XSL変換を適用し直します。変換し直した結果は、id="content"で指定された範囲に埋め込まれます。
画面上のボタンをクリックしてgoneto(6)が実行されるようにすれば、XSLのexpr="getpos(1)"
はexpr="getpos(6)"
に書き変えられます。すると、検索結果の表示が1〜5件目から6〜10件目に置き換わるはずです。
では、XSLを次のように書き直してテストしてみましょう。
動的範囲指定のXSLファイル |
<?xml version="1.0" encoding="Shift_JIS"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/TR/WD-xsl" xmlns:fm="http://www.filemaker.com/fmpdsoresult" xml:lang="ja">
<xsl:template><xsl:apply-templates /></xsl:template>
<xsl:template match="text()"><xsl:value-of select="."/></xsl:template>
<xsl:script language="javascript">
<![CDATA[
pos = 0;
function getpos(spos){
epos = spos + 4;
pos = pos + 1;
if(pos >= spos && pos <= epos){
return true;
}else{
return false;
}
}
]]>
</xsl:script>
<xsl:template match="FMPXMLRESULT">
<html>
<head><title>検索結果</title>
<script language="javascript">
<xsl:comment><![CDATA[
function gonextp(spos) {
var key = document.XSLDocument.selectSingleNode("*/xsl:template[@match='ROW']/xsl:if/@expr");
key.value = "getpos(" + spos + ")";
var d = document.XMLDocument.selectSingleNode("FMPXMLRESULT/RESULTSET");
content.innerHTML = d.transformNode(document.XSLDocument);
}
function sort(sortfld) {
sortfld = sortfld - 1;
var key = document.XSLDocument.selectSingleNode("*/xsl:template[@match='RESULTSET']//xsl:apply-templates[@select='ROW']/@order-by");
key.value = "COL[" + sortfld + "]/DATA";
var d = document.XMLDocument.selectSingleNode("FMPXMLRESULT/RESULTSET");
content.innerHTML = d.transformNode(document.XSLDocument);
}
]]></xsl:comment>
</script>
</head>
<body>
<span id="content"><xsl:apply-templates select="RESULTSET" /></span>
<p><a id="nextp" href="javascript:gonextp(6)">nextPage</a></p>
</body>
</html>
</xsl:template>
<xsl:template match="RESULTSET">
<table border="1">
<tr>
<th><a href="javascript:sort(0)">name</a></th>
<th><a href="javascript:sort(1)">os</a></th>
<th><a href="javascript:sort(2)">price</a></th>
<th><a href="javascript:sort(3)">color</a></th>
</tr>
<xsl:apply-templates select="ROW" order-by="COL[0]/DATA" />
</table>
</xsl:template>
<xsl:template match="ROW">
<xsl:if expr="getpos(1)">
<tr><xsl:apply-templates select="COL" /></tr>
</xsl:if>
</xsl:template>
<xsl:template match="COL">
<td><xsl:value-of select="DATA" /></td>
</xsl:template>
</xsl:stylesheet>
|
画面上の「nextPage」をクリックすると、javascriptによってXSLが書き変わって、表示範囲が変わります。
expr="getpos(1)"がexpr="getpos(6)"に変わるだけじゃダメだ
画面上の「nextPage」をクリックするとexpr="getpos(1)"がexpr="getpos(6)"に書き変わりますが、それだけで、以後はこれを何回クリックしてもexpr="getpos(6)"はexpr="getpos(6)"に書き変えられるだけで何も変わりません。nextPageをクリックするたびに5件ずつ表示範囲をずらしていくためにはどうしたらいいでしょう。
XSLを書き変えるついでに、次の書き変えに備えてhref="javascript:gonextp(6)"も書き変えるようにスクリプトを改造しましょう。
ついでにnextPageも書き変えるJavaScript |
function gonextp(spos) {
var key = document.XSLDocument.selectSingleNode("*/xsl:template[@match='ROW']/xsl:if/@expr");
key.value = "getpos(" + spos + ")";
var d = document.XMLDocument.selectSingleNode("FMPXMLRESULT/RESULTSET");
content.innerHTML = d.transformNode(document.XSLDocument);
spos = spos + 5;
nextp.href = "javascript:gonextp(" + spos + ")";
}
|
最後に追加した2行がポイントです。関数実行時に渡されたsposの数値に5を足して、新しい「nextPage」ボタンを作っています。nextp.href
は「id="nextp"である要素のhref属性」という意味です。これでjavascript:gonextp( )の数値がクリックするたびに5ずつ増えてくれます。>>