XMLとXSLとXSLTと
今ある画面定義情報(某VisualConform形式)をXMLに変換して、Web画面(HTML)を生成する処理を考えてみた。
Java 入門 | XSLT - XSL Transformation
XSLT > 概要 @みっちーわーるど
いろいろできるなーと思いつつ、変数とか分岐とかループとかあるけどちょっと弱いような。
テキストフィールド(固定文字)に対する設定情報を、全てXMLの情報にしたとしても、それをCSSに持っていくXSLを記述しきれる気がしない。
同じ変数に何度も代入できれば、もう少しなんとかなりそうなんだけどなぁ〜
けど、設定する属性が限られてるので、全部書いちゃえばいいような気がしないでもない。
けそ、それがメンテしやすいかどうか…
【XMLファイル】
<?xml version="1.0" encoding="UTF-8"?> <form> <elements> <element> <type>textfield</type> <text>ユーザID</text> <x>100</x> <y>40</y> <endx>300</endx> </element> <element> <type>textfield</type> <text>パスワード</text> <x>100</x> <y>80</y> <endx>300</endx> </element> </elements> </form>
【XSLファイル】
<?xml version="1.0" encoding="UTF-8"?> <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> <!-- 結果ツリーの出力方法 --> <xsl:output method="xml" indent="yes" encoding="UTF-8"/> <!-- テンプレート --> <xsl:template match="/"> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" /> <style>.common{position:absolute;z-index:-1;}</style> </head> <body> <form> <!-- テキストフィールドの場合のテンプレート処理 --> <xsl:apply-templates select="/form/elements/element/type[text()='textfield']" /> </form> </body> </html> </xsl:template> <!-- テンプレート - テキストフィールド --> <xsl:template match="/form/elements/element/type[text()='textfield']"> <!-- スタイル - 左上からのX座標 --> <xsl:variable name="style001" select="concat('left:', (../x), 'px;')" /> <!-- スタイル - 左上からのY座標 --> <xsl:variable name="style002" select="concat('top:', (../y), 'px;')" /> <!-- スタイル - 描画する幅(X座標の終点−X座標) --> <xsl:variable name="style003" select="concat('width:', string(../endx - ../x), 'px;')" /> <!-- スタイルの文字列を結合 --> <xsl:variable name="style" select="concat($style001, $style002, $style003)" /> <!-- SPANタグでテキストを出力 --> <span class="common"> <xsl:attribute name="style"><xsl:value-of select="$style" /></xsl:attribute> <xsl:value-of select="../text" /> </span> </xsl:template> </xsl:stylesheet>
【Javaのコード】
import java.io.FileOutputStream; import javax.xml.transform.Transformer; import javax.xml.transform.TransformerFactory; import javax.xml.transform.stream.StreamResult; import javax.xml.transform.stream.StreamSource; public class XsltForm { public static void main(String[] args) { try { // XSLTのストリーム・ソース StreamSource xsltSrc = new StreamSource("【XSLファイル】"); // ソース・ツリーのストリーム・ソース StreamSource source = new StreamSource("【XMLファイル】"); // 結果ツリーのストリーム・リザルト StreamResult result = new StreamResult(new FileOutputStream("【HTMLファイル】")); // XSLTプロセッサのファクトリの生成 TransformerFactory tFactory = TransformerFactory.newInstance(); // XSLTプロセッサの生成 Transformer transformer = tFactory.newTransformer(xsltSrc); // 変換と結果ツリーの出力 transformer.transform(source, result); } catch (Exception e) { e.printStackTrace(); } } }
【生成されたHTML】
<?xml version="1.0" encoding="UTF-8"?> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"/> <style>.common{position:absolute;z-index:-1;}</style> </head> <body> <form> <span class="common" style="left:100px;top:40px;width:200px;">ユーザID</span> <span class="common" style="left:100px;top:80px;width:200px;">パスワード</span> </form> </body> </html>