- PR -

XSLT内で強制バッファフラッシュ

1
投稿者投稿内容
さくらー
会議室デビュー日: 2003/04/20
投稿数: 16
お住まい・勤務地: 住まい:群馬・勤務地:東京
投稿日時: 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 ]
MMX
ぬし
会議室デビュー日: 2001/10/26
投稿数: 861
投稿日時: 2003-10-12 09:04
ランダムアクセスの処理を回避できるのなら
XSLTではなく、SAXや生テキスト処理のほうが
ここの処理形態には合致すると思います。
ブラウザ側のXSLTはあてにできませんか?

[ メッセージ編集済み 編集者: MMX 編集日時 2003-10-12 09:08 ]
さくらー
会議室デビュー日: 2003/04/20
投稿数: 16
お住まい・勤務地: 住まい:群馬・勤務地:東京
投稿日時: 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

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