- - PR -
XSLの書き方?
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 ] |
|
投稿日時: 2001-09-11 14:05
XMLとXSLの部分がそのままブラウザで表示されてしまって、ソースが読めなくなっていますね。
編集して「この投稿でHTMLを使わない」オプションをONにするか、ソースコードの部分をBBコードのCODEタグで囲っていただけますか? _________________ 樋口 理 株式会社アットマーク・アイティ |
1