- PR -

XSLの書き方?

1
投稿者投稿内容
ひでひろ
会議室デビュー日: 2001/09/11
投稿数: 1
投稿日時: 2001-09-11 13:06
はじめまして、藤原と申します。
今回、XMLでのデータベースを作成しているのですが
データベースエンジンからXMLの形式でデータを返す
ようにしてXSLを使って検索結果をHTMLで表示する
ようにしています。
その場合、Mac,Windows両方から見れるようにしたかったのと
クライアント数が多かったのでmsxmlをバージョンを3にせず
そのままIE5.0xで表示できるようにしてきました。
が、範囲指定の動的部分がうまくいかずに困っています。
いい方法はないでしょうか。
以下が作っているXMLとXSLです。


XML
<?xml version="1.0" encoding="EUC-JP"?>
<?xml-stylesheet type="text/xsl" href="doc.xsl"?>
<docs>
<totalrecord>トータルレコード数</totalrecord>
<hitword>検索した言葉</hitword>
<report>
<outputfile></outputfile>
<filename></filename>
<createdate></createdate>
<keyword></keyword>
</report>
<hitrecord>検索でヒットした件数</hitrecord>
</docs>
上記のような形で<report></report>がヒットした分だけ入ります。


これをXSLで長くて申し訳ないのですが


<?xml version="1.0" encoding="EUC-JP"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/TR/WD-xsl">
<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="/">
<HTML>
<HEAD>
<TITLE></TITLE>
<!--
<META HTTP-EQUIV="Refresh" CONTENT="1"></META>
-->
<SCRIPT language="JavaScript">
<xsl:comment>
<![CDATA[
function gonextp(spos) {
var key = document.XSLDocument.selectSingleNode("*/xsl:template[@match='report']/xsl:if/@expr");
key.value = "getpos(" + spos + ")";
var d = document.XMLDocument.selectSingleNode("docs");
rep.innerHTML = d.transformNode(document.XSLDocument);
var s = document.XMLDocument.selectSingleNode("docs/hitrecord").value;
spos = spos + 5;
nextp.href = "javascript:gonextp(" + spos + ")";
if(spos >= s){nextp.style.display = "none";}
spos = spos - 10;
prevp.href = "javascript:goprevp(" + spos + ")";
prevp.style.display = "inline";
}
function goprevp(spos) {
var key = document.XSLDocument.selectSingleNode("*/xsl:template[@match='report']/xsl:if/@expr");
key.value = "getpos(" + spos + ")";
var d = document.XMLDocument.selectSingleNode("docs");
spos = spos + 10;
nextp.href = "javascript:gonextp(" + spos + ")";
nextp.style.display = "inline";
spos = spos - 15;
prevp.href = "javascript:goprevp(" + spos + ")";
if(spos <= 0){prevp.style.display = "none";}
}
function changesort(key) {
var s = document.XSLDocument.selectNodes("*/xsl:template[@match='docs']//xsl:apply-templates/@order-by");
for (var i = s.nextNode(); i != null; i = s.nextNode())
{
i.value ="-" + key;
}
var d = document.XMLDocument.selectSingleNode("docs");
rep.innerHTML = d.transformNode(document.XSLDocument);
}
function sort(key) {
var s = document.XSLDocument.selectNodes("*/xsl:template[@match='docs']//xsl:apply-templates/@order-by");
for (var i = s.nextNode(); i != null; i = s.nextNode())
{
i.value = key;
}
var d = document.XMLDocument.selectSingleNode("docs");
rep.innerHTML = d.transformNode(document.XSLDocument);
}
]]></xsl:comment></SCRIPT>
</HEAD>
<BODY BGCOLOR="#ffffff" TEXT="#000000"
LINK="#0033ff" ALINK="#ff0000" VLINK="#9900cc">
<DIV id="rep">
<xsl:apply-templates select="docs"/>
</DIV>
<BR/> <HR/>
<H2 ALIGN="center">
<A HREF="../index.html" TARGET="_top">検索画面に戻る</A>
<A id="prevp" HREF="javascript:goprevp(-4)">PrevPage</A>
        <A id="nextp" HREF="javascript:gonextp(6)">NextPage</A>
</H2>
</BODY>
</HTML>
</xsl:template>
<xsl:template match="docs">
<TABLE BGCOLOR="black" BORDER="0" CELLPADDING="0" CELLSPACING="0" WIDTH="100%">
<TR>
<TH>
<TABLE BORDER="0" CELLPADDING="2" CELLSPACING="1" WIDTH="100%">
<TR ALIGN="center" BGCOLOR="#EEEEEE">
<TH WIDTH="30%"><A href="javascript:sort('filename')">文書名</A> <A href="javascript:changesort('filename')">(降順)</A></TH>
<TH WIDTH="30%"><A href="javascript:sort('createdate')">作成日</A> <A href="javascript:changesort('createdate')">(降順)</A></TH>
<TH WIDTH="40%"><A href="javascript:sort('keyword')">キーワード</A> <A href="javascript:changesort('keyword')">(降順)</A></TH>
</TR>
<xsl:apply-templates select="report" order-by="outputfile"/>
</TABLE>
</TH>
</TR>
</TABLE>
</xsl:template>
<xsl:template match="report">
<xsl:if expr="getpos(1)">
<TABLE RULES="groups" BGCOLOR="WHITE" WIDTH="100%">
<THEAD>
<TR BGCOLOR="WHITE">
<TD><B><A>
<xsl:attribute name="HREF">Doc/<xsl:value-of select="outputfile"/></xsl:attribute>
<xsl:value-of select="filename"/></A></B></TD>
</TR>
<TR BGCOLOR="WHITE">
<TD ALIGN="left">
<xsl:value-of select="createdate"/>
</TD>
</TR>
<TR BGCOLOR="WHITE">
<TD ALIGN="left">
<xsl:value-of select="keyword"/>
</TD>
</TR>
</THEAD>
</TABLE>
</xsl:if>
</xsl:template>
</xsl:stylesheet>


長くて申し訳ございません。
ここでnumber,position,countなどを使えばもっとスマートにいくのでしょうが
MSXML3.0にしないとだめという部分がありIE6の正式リリースを待てずに
やってみました。
pos(ポジション)という関数を作っていま何番目かというのを出そうとしているのですが
NextPageで5件ずつ送って表示してPrevPageで5件戻る。ということをしようとしてます。
ページ送りはできても、戻りがうまくいきません。
その上、<hitrecord>の数を見て、NextPageとPrevPageを表示する、しないを指示してる
はずなのですがうまくいきません。
どこか間違ってるのでしょうか?
またMSXML3.0ならもっとシンプルなんでしょうか?

[ メッセージ編集済み 編集者: ひでひろ 編集日時 2001-09-11 14:19 ]
樋口/@IT
@ITスタッフ
会議室デビュー日: 2001/07/26
投稿数: 293
お住まい・勤務地: 東京都
投稿日時: 2001-09-11 14:05
XMLとXSLの部分がそのままブラウザで表示されてしまって、ソースが読めなくなっていますね。
編集して「この投稿でHTMLを使わない」オプションをONにするか、ソースコードの部分をBBコードのCODEタグで囲っていただけますか?
_________________
樋口 理
株式会社アットマーク・アイティ
1

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