S_a_k_Uの日記みたいなDB

~サクゥーと呼ばないで~

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>