CLOVER🍀

That was when it all began.

XHTML to JSP…の実験

今日、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