今日、XSLTを勉強していた理由は、XHTMLで書かれたコンテンツをJSPに変換したかったから、というもの。
残念ながら、ちょっと中途半端なところでタイムアップしちゃったのですが、成果を載っけておきます。
変換元XHTML。
<?xml version="1.0" encoding="UTF-8"?> <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="ja"> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" /> <link rel="stylesheet" type="text/css" href="/css/site.css" media="screen, projection" /> </head> <body> <div id="container"> <div id="header"> <h1>XHTML to JSP convert example</h1> </div> <div id="wrapper"> <form action="/" method="POST"> ID:<input type="text" name="id" /><br /> FirstName:<input type="text" name="firstName" /><br /> LastName:<input type="text" name="lastName" /><br /> <br /> <input type="submit" value="送信" /> </form> </div> <div id="footer"> Copyright Kazuhira, All Right Reserved. </div> </div> </body> </html>
XSLスタイルシート。
<?xml version="1.0" encoding="UTF-8"?> <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:xhtml="http://www.w3.org/1999/xhtml"> <xsl:output method="xml" indent="yes" encoding="UTF-8" /> <xsl:template match="/"> <xsl:text disable-output-escaping="yes"><![CDATA[<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">]]> </xsl:text> <xsl:text disable-output-escaping="yes"><![CDATA[<% @page pageEncoding="UTF-8" %>]]> </xsl:text> <xsl:text disable-output-escaping="yes"><![CDATA[<% @taglib prefix="html" uri="http://struts.apache.org/tags-html" %> ]]> </xsl:text> <xsl:text disable-output-escaping="yes"><![CDATA[<% @taglib prefix="s" uri="http://sastruts.seasar.org" %>]]> </xsl:text> <xsl:apply-templates /> </xsl:template> <xsl:template match="xhtml:form"> <xsl:text disable-output-escaping="yes"><![CDATA[<s:form ]]></xsl:text> <xsl:for-each select="@*"><xsl:value-of select="name()" />="<xsl:value-of select="." />" </xsl:for-each> <xsl:text disable-output-escaping="yes"><![CDATA[>]]></xsl:text> <xsl:apply-templates /> <xsl:text disable-output-escaping="yes"><![CDATA[</s:form>]]></xsl:text> </xsl:template> <xsl:template match="xhtml:input"> <xsl:choose> <xsl:when test="@type='text'"> <xsl:text disable-output-escaping="yes"><![CDATA[<html:text ]]></xsl:text>property="<xsl:value-of select="@name" />"<xsl:text disable-output-escaping="yes"><![CDATA[ />]]></xsl:text> </xsl:when> <xsl:when test="@type='submit'"> <xsl:text disable-output-escaping="yes"><![CDATA[<s:submit ]]></xsl:text>value="<xsl:value-of select="@value" />"<xsl:text disable-output-escaping="yes"><![CDATA[ />]]></xsl:text> </xsl:when> <xsl:otherwise> <xsl:copy> <xsl:apply-templates select="node()|@*"/> </xsl:copy> </xsl:otherwise> </xsl:choose> </xsl:template> <xsl:template match="node()|@*"> <xsl:copy> <xsl:apply-templates select="node()|@*" /> </xsl:copy> </xsl:template> </xsl:stylesheet>
変換結果(動作確認なんて、してません!)。
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <% @page pageEncoding="UTF-8" %> <% @taglib prefix="html" uri="http://struts.apache.org/tags-html" %> <% @taglib prefix="s" uri="http://sastruts.seasar.org" %> <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="ja"> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"/> <link rel="stylesheet" type="text/css" href="/css/site.css" media="screen, projection"/> </head> <body> <div id="container"> <div id="header"> <h1>XHTML to JSP convert example</h1> </div> <div id="wrapper"> <s:form action="/" method="POST" > ID:<html:text property="id" /><br/> FirstName:<html:text property="firstName" /><br/> LastName:<html:text property="lastName" /><br/> <br/> <s:submit value="送信" /> </s:form> </div> <div id="footer"> Copyright Kazuhira, All Right Reserved. </div> </div> </body> </html>
なぜかDOCTYPEをXSLスタイルシート中で書いているのは、XHTMLファイルの方に書いていても問題なく動くんですけど、ネットワークアクセスが発生して時間がかかり過ぎるので、簡単のためこういう形にしました。
SAStrutsおよびStrutsのカスタムタグを生成するようにしたいのですが、タグを生成するところがCDATA入りのかなり力技…。とはいえ、普通にXML-Elementとして作ろうとするとs:とかのPrefixに対する名前空間を求められたり、出力結果にURIが余計に現れたりしてなおハマります…。
ちょっと微妙ですが、いったんここまで!!
参考リソース:
http://www.mitchy-world.jp/xml/xslt/step01.htm
http://www5a.biglobe.ne.jp/~rarin/xml/xslt_tips.html#xml_to_xhtml
http://www.atmarkit.co.jp/fxml/tanpatsu/xslt/xslt00.html
http://www.takamagahara.info/2006/0104