- PR -

JavaServletで検索した結果をXSLTでHTMLに変換して出力する仕方について

投稿者投稿内容
XML
会議室デビュー日: 2005/10/02
投稿数: 10
投稿日時: 2005-10-19 18:12
こんにちは。Xindiceについて勉強している学生です。サンプルプログラムXindiceServelt2を用いてXML文書をHTMLに変換する個所についての質問です。コンパイルはできてクラスファイルは生成できました。しかし、実際にネットからアクセスしてみてもサンプルにあるような表みたいな画面が出力されずに真っ白です。なぜHTML形式で表示ができないのでしょうか?どうかご解答お願いいたします。
MSXML3.0はインストール済みです。ブラウザはIE6.0です。
uk
ぬし
会議室デビュー日: 2003/05/20
投稿数: 1155
お住まい・勤務地: 東京都
投稿日時: 2005-10-20 18:47
これは、@ITの記事を参考にしてやってみた、ということですか?
ブラウザからソース表示をしてみて、どのようなレスポンスが来ているか確認してみてください。
それから、クライアント側に来るときには既にHTMLになっているはずなので、MSXMLは関係
ありません。
XML
会議室デビュー日: 2005/10/02
投稿数: 10
投稿日時: 2005-10-20 20:21
ご返答ありがとうございます。まだまだ知識が乏しく申し訳ありません。@ITの記事を思いっきり参考にやっています。ブラウザからの表示は記事にあるようなHTML表示がされずに真っ白な画面が出力されてしまいます。どのようにしたら@IT記事のように表示できるのでしょうか?よろしければご返答お願いいたします。
uk
ぬし
会議室デビュー日: 2003/05/20
投稿数: 1155
お住まい・勤務地: 東京都
投稿日時: 2005-10-20 21:04
えーと、だからまずソース表示(IEだと「表示」「ソース」)してみてください。
XML
会議室デビュー日: 2005/10/02
投稿数: 10
投稿日時: 2005-10-20 21:15
申し訳ございませんでした。表示してみたところ
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
<HTML><HEAD>
<META http-equiv=Content-Type content="text/html; charset=shift_jis"></HEAD>
<BODY></BODY></HTML>
と表示されました。
uk
ぬし
会議室デビュー日: 2003/05/20
投稿数: 1155
お住まい・勤務地: 東京都
投稿日時: 2005-10-20 21:32
なるほど、何も出力されていないようですね。ソースコードは@ITの記事と同じものですか?
さしつかえなければ、ソースの内容を載せてみてもらえませんか?
らい
大ベテラン
会議室デビュー日: 2005/08/02
投稿数: 159
お住まい・勤務地: 東京都と千葉県のさかいめ
投稿日時: 2005-10-20 21:34
らいと申します。

引用:

XMLさんの書き込み (2005-10-20 21:15) より:
申し訳ございませんでした。表示してみたところ
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
<HTML><HEAD>
<META http-equiv=Content-Type content="text/html; charset=shift_jis"></HEAD>
<BODY></BODY></HTML>
と表示されました。


ということは、XML -> HTMLはできてるけど、
肝心の表が表示されない、ということですね?

表示の際に使ったXSLや、コンパイルしたもののソースを
再チェックしてみたほうがよいかも。

# おそらく、XSLはダウンロードしたものを使ったのでしょうから、
# コンパイルしたもののソースを見たほうがいいと思います。

# あぁぁ、XML/XSLを使ってたのが数年前なので、
# そちら方面の構文とかちと忘れ気味です。orz

_________________
一寸先は闇
安定してるシステムって言ったじゃん(泣)
XML
会議室デビュー日: 2005/10/02
投稿数: 10
投稿日時: 2005-10-20 21:40
みなさんお返事ありごとうございます。まったく@ITの記事と同じものを使用しています。サーブレットのソースは以下のものを使用いたしました。XSLTも記事からダウンロードして使用しています。
import java.io.*;
import javax.servlet.*;
import javax.servlet.http.*;
import org.xmldb.api.base.*;
import org.xmldb.api.modules.*;
import org.xmldb.api.*;
import org.w3c.dom.*;

public class XindiceServlet2 extends HttpServlet {

// HTTP GETに対応するメソッド
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {

// HTMLで返します
response.setContentType("text/html; charset=Shift_JIS");

PrintWriter out = response.getWriter();

try {
// 検索した結果をXSLTでHTMLに変換し出力します
transform(out, getServletContext().getRealPath("/sample.xsl"));
}
catch (Exception e) {
throw new ServletException(e);
}
finally {
out.close();
}
}

// 検索した結果をスタイルシートstylesheetUrlを使ってXSLTでHTMLに変換し、
outに出力します
public void transform(Writer out, String stylesheetUrl) throws Exception {
String xpath = "//action";
javax.xml.transform.Transformer transformer =
getTransformer(stylesheetUrl);
transformer.transform(new
javax.xml.transform.dom.DOMSource(searchWithXindice(xpath)), new
javax.xml.transform.stream.StreamResult(out));
}

// JAXPを使ってXSLTに使うTransformerを得ます
private javax.xml.transform.Transformer getTransformer(String url) throws
Exception {
javax.xml.transform.TransformerFactory tFactory =
javax.xml.transform.TransformerFactory.newInstance();
javax.xml.transform.Transformer transformer;
transformer = tFactory.newTransformer(new
javax.xml.transform.stream.StreamSource(url));
return transformer;
}

// XindiceからXPathを使って検索します
private Document searchWithXindice(String xpath) throws Exception {
Collection col = null;

// 検索結果をまとめる要素<result>を作成する
javax.xml.parsers.DocumentBuilderFactory docBuilderFactory =
javax.xml.parsers.DocumentBuilderFactory.newInstance();
docBuilderFactory.setNamespaceAware(true);
Document resultDocument =
docBuilderFactory.newDocumentBuilder().newDocument();
// 次の設定はXindiceから取得したDOMオブジェクトをXercesでimportする
ためには必要

((org.apache.xerces.dom.DocumentImpl)resultDocument).setErrorChecking(false);
Element resultElement = resultDocument.createElement("result");
resultDocument.appendChild(resultElement);

try {
// 1. Database実装クラスの登録
String driver = "org.apache.xindice.client.xmldb.DatabaseImpl";
Class c = Class.forName(driver);
Database database = (Database) c.newInstance();
DatabaseManager.registerDatabase(database);

// 2. コレクションの取得
col = DatabaseManager.getCollection("xmldb:xindice:///db/sampledb");

// 3. XPathQueryServiceの取得
XPathQueryService service =
(XPathQueryService) col.getService("XPathQueryService", "1.0");

// 5. XPathで検索
ResourceSet resultSet = service.query(xpath);

// 6. ResourceSetから検索結果を取り出す
ResourceIterator results = resultSet.getIterator();
while (results.hasMoreResources()) {
Resource res = results.nextResource();
if (res.getResourceType().equals("XMLResource")) {
org.xmldb.api.modules.XMLResource xmlres =
(org.xmldb.api.modules.XMLResource)res;
org.w3c.dom.Node node = xmlres.getContentAsDOM();

resultElement.appendChild(resultDocument.importNode(node.getFirstChild(), true));
}
}
}
catch (XMLDBException e) {
throw new ServletException(e);
}
finally {
if (col != null) {
// 7. コレクションのクローズ
col.close();
}
}

return resultDocument;
}

}

なにか問題があればお願いいたします。

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