< 日付を整形する | Server.Execute() >

November 14, 2003

XSLTを使用してXHTMLを出力する

HTMLを出力するサンプルは巷にあふれているんだけど、XHTMLとして出力する方法がなかなかわからなかったので、サンプルを作ってみました。ついでなんで、XHTMLにネームスペースのプリフィックスをつける例としてみました。
(もちろん、stylesheetのところで宣言しているXHTMLのプリフィックス":xhtml"を省略し、namespase-alias指定を削除すると、通常のXHTMLのようにかけます)

ポイント(というほどのことでもないけど)は、outputでmethod="xml"にすることでしょうか。

ただし、これを使用してMSXMLで変換をかけると、xml宣言がencoding="UTF-16"固定になってしまいます。形だけでも"Shift_JIS"で出てほしいものです。

(多分、COMコンポーネントなので、出力はユニコードだから、ってことなんだろう、と解釈)

お題のxml サンプルxsl

<?xml version="1.0" encoding="Shift_JIS"?>
<xsl:stylesheet version="1.0" 
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
    xmlns:xhtml="http://www.w3.org/1999/xhtml">
    
    <!-- xhtmlネームスペースを通常の出力に -->
    <xsl:namespace-alias stylesheet-prefix="xhtml" result-prefix="#default"/>
    
    <!-- 出力方法を定義(DOCTYPEを出力させる) -->
    <xsl:output 
        method="xml" 
        encoding="Shift_JIS" 
        doctype-public="-//W3C//DTD XHTML 1.1//EN" 
        doctype-system="http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd" 
        indent="yes" 
        media-type="text/html; charset=Shift_JIS"/>
    
    <!-- ルートノード -->
    <xsl:template match="/">
        <xhtml:html xmlns="http://www.w3.org/1999/xhtml" xml:lang="ja">
        <xhtml:head>
            <xhtml:meta http-equiv="content-type" content="application/xhtml+xml; charset=Shift_JIS" />
            <xhtml:meta http-equiv="content-script-type" content="text/javascript" />
            <xhtml:meta http-equiv="content-style-type" content="text/css" />
            <xhtml:link rel="stylesheet" href="./style.css" type="text/css" />
            <xhtml:title>ドキュメントタイトル</xhtml:title>
        </xhtml:head>
        
        <xhtml:body>
        
        <!-- 下位テンプレートをロード -->
        <xsl:apply-templates />
        </xhtml:body>
        
        </xhtml:html>
    </xsl:template>
    
    <!-- languagesノードのテンプレート -->
    <xsl:template match="languages">
        <xhtml:table summary="言語一覧">
            <xhtml:thead>
                <xhtml:tr>
                    <xhtml:th abbr="言語">言語</xhtml:th>
                    <xhtml:th abbr="言語の説明">説明</xhtml:th>
                </xhtml:tr>
            </xhtml:thead>
            <xhtml:tbody>
                <xsl:for-each select="language">
                    <xsl:sort select="@name" order="ascending"    />
                    <xsl:apply-templates select="." />
                </xsl:for-each>
            </xhtml:tbody>
        </xhtml:table>
    </xsl:template>
    
    <!-- 言語ごとのテンプレート -->
    <xsl:template match="language">
        <xhtml:tr>
            <xhtml:th><xsl:value-of select="@name"/></xhtml:th>
            <xhtml:td><xsl:value-of select="description"/></xhtml:td>
        </xhtml:tr>
    </xsl:template>
    
</xsl:stylesheet>

トラックバック

このエントリーにトラックバック:
http://frog.raindrop.jp/cgi-bin/mt/mt-tb.cgi/11

コメント

コメントする

※ コメントスパム対策のため、コメント本文はおはよう、こんにちわ、こんばんわのいずれかより始めるようにしてください。

name:
email:

※ 必要ですが、表示しません。

url:
情報を保存する ?