- - PR -
XSLT内で強制バッファフラッシュ
1
投稿者 | 投稿内容 |
---|---|
|
投稿日時: 2003-10-12 02:33
Javaの方に投稿するか悩んだのですが・・とりあえずこちらへ・・。
<xsl:for-each select="sql/item"> <table border="1"> <tr> <td><xsl:value-of select="USER_ID"/></td> <td><xsl:value-of select="USER_NAME"/></td> <td><xsl:value-of select="USER_PASS"/></td> </tr> </table> ※<<<<ここで強制的にバッファをフラッシュ(ブラウザに出力)させたい </xsl:for-each> のような構造で、※の部分の事をやりたいのですが、 方法が判りません。 Javaで独自XSLタグを・・とも考えたのですが、そもそも 上記段階でのOutputStreamを取得するすべが判らず・・・・。 旨い方法は無いものでしょうか? 出力する側は独自のServletでjavax.xml.transform.Transformer のtransformでXMLをHttpServletResponseのgetWriterに割り当てています。 HttpServletResponseのsetBufferSizeでサイズを小さめにしてみたのですが、 XSL/XMLのマージが終わってからで無ければ、出力されていないようです。 (つまりsetBufferSizeはこの場合意味が無いと認識) [ メッセージ編集済み 編集者: さくらー 編集日時 2003-10-12 02:42 ] |
|
投稿日時: 2003-10-12 09:04
ランダムアクセスの処理を回避できるのなら
XSLTではなく、SAXや生テキスト処理のほうが ここの処理形態には合致すると思います。 ブラウザ側のXSLTはあてにできませんか? [ メッセージ編集済み 編集者: MMX 編集日時 2003-10-12 09:08 ] |
|
投稿日時: 2003-10-13 01:41
XMLとXSLTをマージした結果(つまりこの段階でHTML)をSAXにかけたらparse段階で
White spaces are required between publicId and systemId. と言うエラーになってしまいました・・。(^^;; 結局自前で FileInputStream fis = new FileInputStream( xsltfile ); InputStreamReader isr = new InputStreamReader( fis, encoding ); TransformerFactory factory = TransformerFactory.newInstance(); Transformer transformer = factory.newTransformer(new StreamSource(isr)); // 出力先を自前バッファにしてXMLとXSLTをマージ ByteArrayOutputStream outBuf = new ByteArrayOutputStream(); transformer.transform( new DOMSource( pret.xmldoc ), new StreamResult(outBuf)); // マージした結果を行単位で取得し /tableが出現したタイミングでバッファをフラッシュ ByteArrayInputStream bai = new ByteArrayInputStream( outBuf.toByteArray() ); BufferedReader br = new BufferedReader( new InputStreamReader( bai ) ); String val = new String(); for( ;; ) { val = br.readLine(); if( val == null ) break; out.println( val ); if( val.toLowerCase().indexOf( "/table" ) != -1 ) { out.flush(); } } のように、 /table が見つかったタイミングでストリームをフラッシュ してやるようにして対応しました。 遅いかな?とも思ったのですが、実験したところ 1169行文あるTABLEタグで for( ;; ) {の直前から対応する } の直後までで1秒だったので、 実用に耐えそうなので、今回はこれで逃げる事します。 MMX殿、ご意見有難う御座いました。 |
1