※上記の広告は60日以上更新のないWIKIに表示されています。更新することで広告が下部へ移動します。

xsltまとめ。


javascriptでのxsltの利用方法。(firefox用)


※xslにxmlns="http://www.w3.org/1999/xhtml" を追加しないと、正しく表示されず。
 xsl内でjavascriptが使えるかが不明。

javascriptコード
	<html>
<head>
	<title>Untitled</title>
	<Script LANGUAGE="JavaScript">
	<!--
		function clickFirefoxTest(){
			var xmlhttp =  new XMLHttpRequest();
			xmlhttp.onreadystatechange = readystatechange;
			xmlhttp.open("GET", "testxml.xml", true);
			xmlhttp.send(null);

			function readystatechange(){
			    if (xmlhttp.readyState == 4 && xmlhttp.status == 200) {
			        var xml = xmlhttp.responseXML;

			        var xslt = new XSLTProcessor();
			        var xsltDoc =  document.implementation.createDocument("", "", null);
			        xsltDoc.async = false;
			        xsltDoc.load("testxsl.xsl")
			        xslt.importStylesheet(xsltDoc);

			        var fragment = document.implementation.createDocument("", "", null);
			        var doc =  xslt.transformToFragment(xml, fragment);

			        var target = document.getElementById("target")
			        while (target.hasChildNodes()) {
			            target.removeChild(target.lastChild);
			        }
			        target.appendChild(doc);
			    }
			}
		}
	
	// -->
	</Script>
</head>

<body>

<form action=".">
    <p><input type="button" onclick="clickFirefoxTest();" value="Firefox" /></p>
</form>
<div id="target"></div>

</body>
</html>

xslファイル
	<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0"
     xmlns="http://www.w3.org/1999/xhtml" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:yahoo="urn:yahoo:jp:auc:leaf" xml:lang="ja">

<xsl:template match="/yahoo:AuctionCategoryLeaf">
	<table>
		<caption>aaa</caption>
		<xsl:apply-templates />
	</table>
</xsl:template>

<xsl:template match="yahoo:item">
	<tr>
		<td><xsl:value-of select="yahoo:title" /></td>
	</tr>
</xsl:template>

</xsl:stylesheet>

Parameterの渡し方について。(servlet→xsl)

xsl内に<xsl:param name="timeParam" select="1"/>を宣言。
servelt内で、

int paramTime = 1;

Transformer transformer = factory.newTransformer(xslSource);
	
//Parameterを付与
Object obj = new Integer(paramTime);
transformer.setParameter("timeParam", obj);
	
transformer.transform(xmlSource, new StreamResult(bw));

※setParameterに渡すのは、param名とObjectである点に注意。		

2007/02/22xsl変更(ファルダxalan内)

  • xalanのエクステンションについて
<xsl:variable name="dateobj" select="util:get($calender,5)"/>のところで、Calender.DATEを指定しようとしたが、うまく行かず、
直接5を指定している。javaのメソッドを直接呼び出せるが、フィールドは難しい?やはり、拡張classを作るべきか。

  • 追記:2007/02/22 通常のjavaのクラスライブラリへ、オリジナルのパッケージを登録することで、ある程度の問題を解決。
C:\j2sdk1.4.2_08\jre\lib\ext と C:\Program Files\Java\jre1.5.0_09\lib\ext にjar形式のパッケージを追加。

追記:C:\Program Files\Java\jre1.5.0_11\lib\extの方に追加しないと実行しない場合がある?

xlsの変更点。
xmlns:date="xalan://mytest"を追加。

<xsl:template match="yahoo:item">

   <xsl:variable name="dateobj" select="date:test.StringDate.new()"/> ←変更
    <xsl:variable name="datesb" select="date:getDate($dateobj)"/>   ←変更
	
<xsl:if test="contains(yahoo:endtime,concat($datesb,'時'))">

  • nowrapについて。
htmlにおいて、<td nowrap>はxmlでは、厳格に<td nowrap="nowrap">と記述する必要がる。

  • 参考url

<?xml version="1.0" encoding="UTF-8"?>

<xsl:stylesheet version="1.0"
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:yahoo="urn:yahoo:jp:auc:search" xmlns:util="xalan://java.util" xmlns:lang="xalan://java.lang">

<xsl:template match="/yahoo:AuctionSearchResult">

  <html>
  <head>
  <title>xsltest</title>
  </head>
  <body>
  	<table CELLPADDING="2" CELLSPACING="0" BORDER="2" WIDTH="100%">

	<tr BGCOLOR="#dcdcdc">

	<td ALIGN="center" nowrap="nowrap"><small>タイトル</small></td>
	<td ALIGN="center" nowrap="nowrap"><small>現在価格</small></td>
	<td ALIGN="center" nowrap="nowrap"><small>入札</small></td>
	<td ALIGN="center" nowrap="nowrap"><small>終了予定時間</small></td>

	</tr>
	
    	<xsl:apply-templates />
   	
   	</table>
   	
 </body>
 </html>
  	
</xsl:template>

<xsl:template match="yahoo:item">

       <xsl:variable name="calender" select="util:Calendar.getInstance()"/>
       <xsl:variable name="dateobj" select="util:get($calender,5)"/>
       <xsl:variable name="datesb" select="lang:Integer.toString($dateobj)"/>

       <xsl:if test="contains(yahoo:endtime,concat($datesb,'日'))">

       <tr BGCOLOR="#eeeeee">
       <td ALIGN="left" nowrap="nowrap"><a><xsl:attribute name="href"><xsl:value-of select="yahoo:url" /></xsl:attribute><xsl:value-of select="yahoo:title" /></a></td>
       <td ALIGN="right" nowrap="nowrap"><b><xsl:value-of select="yahoo:price" /></b></td>
       <td ALIGN="center" nowrap="nowrap"><b><xsl:value-of select="yahoo:bids" /></b></td>
       <td ALIGN="right" nowrap="nowrap"><xsl:value-of select="yahoo:endtime" /></td>
       </tr>
       <tr>
       <td BGCOLOR="#ffffff" COLSPAN="5">
       <img align="left" border="0" hspace="5" width="64" height="65"><xsl:attribute name="src"><xsl:value-of select="yahoo:img" /></xsl:attribute></img>
       </td>
       </tr>

       <tr BGCOLOR="#eeeeee"><td COLSPAN="5"><img SRC="http://a1017.lm.a.yimg.com/7/1017/1783/000/image.auctions.yahoo.co.jp/images/space.gif" WIDTH="1" HEIGHT="1"></img></td></tr>
    
</xsl:if>
    
</xsl:template>

</xsl:stylesheet>


servletでの参考プログラム。

import java.net.*;
import java.io.*;
import javax.servlet.ServletContext;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
 import javax.servlet.http.HttpServletResponse;
import javax.xml.transform.TransformerFactory;
import javax.xml.transform.Transformer;
 import javax.xml.transform.Source;
import javax.xml.transform.stream.StreamSource;
import javax.xml.transform.stream.StreamResult;
	
public class xslttestservlet extends HttpServlet{
	
 public void doGet(HttpServletRequest request,
				  HttpServletResponse response)
 throws ServletException, IOException{

//PrintWriter outより手前で記述しておかないと、文字化けしてしまう。

 	response.setContentType("text/html; charset=Shift-Jis");

//tyr~catch内に記述しておくとエラーになる。 ← 要確認。
	
	PrintWriter out = response.getWriter();
	
        try{
	
	//request.setCharacterEncoding("");
	
//URLクラスで、ストリームをオープン。検索結果を取得(XML)
	
	URL url_yahoo = new URL("http://api.auctions.yahoo.co.jp/AuctionWebService/V1/Search?appid=syanporion&query=win2000");
	InputStream in_xml = new BufferedInputStream(url_yahoo.openStream());
	
	TransformerFactory factory = TransformerFactory.newInstance();

//javax.servlet.ServletContext:サーブレットの設定等を取得するためのインターフェイス。getServletContext().getRealPath()でサーバーのシステム内でのコンテキストのpathを返す。
//()内には、コンテキスト以下のファイルのpathを入力。

	ServletContext context = this.getServletContext();
	String realPath = this.getServletContext().getRealPath("xsltest.xsl");

	Source xmlSource = new StreamSource(in_xml);
        Source xslSource = new StreamSource(new URL("file:"+realPath).openStream());

        Transformer transformer = factory.newTransformer(xslSource);
        transformer.transform(xmlSource, new StreamResult(out));
       
       } catch (Exception e) {
       out.write(e.getMessage());
       e.printStackTrace(out);
       }
       out.close();
}
}

  • サーバーへの配備上の注意。
chmod 755 で、warファイルに実行権限を与えておく。
tomcat、httpdを再起動。(server.xml辺りで、再起動しないでもよくできたはず。)
サーブレットへIEからアクセス。
このとき":8080"をドメインの後ろに追加して、tomcatのみで動作させるとエラーログを吐き出す。実運用では8080を閉じておくべき。

  • web.xmlの例。
<?xml version="1.0" encoding="ISO-8859-1"?>

<!DOCTYPE web-app PUBLIC 
 "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN"
 "http://java.sun.com/dtd/web-app_2_3.dtd">
<web-app>
<servlet>
    <servlet-name>xslttest</servlet-name>
    <servlet-class>xslttestservlet</servlet-class>
  </servlet>
  <servlet-mapping>
    <servlet-name>xslttest</servlet-name>
    <url-pattern>/xslttest</url-pattern>
  </servlet-mapping>
</web-app>

コマンドラインでの参考プログラム。

  • args[1]がxsl、args[2]がxmlを指定して、xmlをxsl指定のhtmlに変換するコマンドアプリケーション例。RADKRAFT参照
import javax.xml.transform.TransformerFactory;
import javax.xml.transform.Transformer;
import javax.xml.transform.stream.StreamSource;
import javax.xml.transform.stream.StreamResult;
import javax.xml.transform.TransformerException;
import javax.xml.transform.TransformerConfigurationException;

import java.io.FileOutputStream;
import java.io.FileNotFoundException;
import java.io.IOException;

public class xslttest {
  public static void main(String[] args)
    throws TransformerException, TransformerConfigurationException,
           FileNotFoundException, IOException {
    String xmlFileName, xslFileName;

    if(args.length != 2){
      System.err.println("usage: Xalan2 in.xsl in.xml > out.html");
      return;
    }
    xslFileName = args[0];
    xmlFileName = args[1];

    TransformerFactory factory = TransformerFactory.newInstance();
    Transformer transformer = factory.newTransformer(new StreamSource(xslFileName));

    //transformer.transform(new StreamSource(xmlFileName), new  StreamResult(System.out));
    transformer.transform(new StreamSource(xmlFileName), new StreamResult(new  java.io.FileOutputStream("xmltest.html")));
  }
}
  • xslファイル
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0"
     xmlns:xsl="http://www.w3.org/1999/XSL/Transform"  xmlns:yahoo="urn:yahoo:jp:auc:search">

<xsl:template match="/yahoo:AuctionSearchResult">
  <html>
  <head>
  <title>xsltest</title>
  </head>
  <body>
    <p align="center">xlsttest</p>
    <xsl:apply-templates />
  </body>
  </html>
</xsl:template>

<xsl:template match="yahoo:item">
    <p><xsl:value-of select="yahoo:title" /></p>
</xsl:template>

</xsl:stylesheet>

※ 説明のxsl記述では、全部のテキスト情報が表示され上手く行かなかった。
  そこで、xmlns:yahoo="urn:yahoo:jp:auc:search"を追加して、各ノード名の後ろにnodename:yahooと追加したとことうまく動作した。
  xsd、targetnamespaceなどが関連していそう。要調査。
    @IT参照
  • xmlファイルは、yahooオークションAPIでの検索結果を利用。