note::memo XSLTに関する記事内、XSLTでフラットな文書を構造化で公開されている構造化スタイルシートを見ていて、私も人様に使ってもらえそうな形にしておこうと思い立ちました。茨の道なので実際あまり薦められる物でもないのですが。
気をつけた点は以下の通りです。
<xsl:include href="このXSLTファイルのURIまたはパス" />
<xsl:stylesheet xmlns:jtr="http://purl.org/jintrick/2003/XSLT" />
<xsl:apply-templates select="/child::*/child::h1" mode="jtr:Structuring" />
h2レベルから構造化を開始させることも出来ます。
<xsl:apply-templates select="/child::*/child::h2" mode="jtr:Structuring" />
特定のセクションのみを構造化することも出来ます。
<xsl:apply-templates select="/child::*/child::h3[string(@id) = 'foo']" mode="jtr:Structuring" />
h7要素とかh8要素、h100要素(理論上)にも対応しています。XHTML2.0に変換できるようにするためです。
<xsl:apply-templates select="/child::*/child::h7" mode="jtr:Structuring" />
*見出しのindexは正の整数である必要があります。0や-1、1.5等は不可。
見出し以外を含むノード集合をカレントノードリストにして、mode="jtr:Structuring"でapply-templatesしないで下さい。とんでもないエラーになります。
<xsl:apply-templates select="child::p" mode="jtr:Structuring" />
*これは絶対にやらないで下さい。mode="jtr:Structuring"にしなければ問題ありません。
見出しがXML名前空間を持っていても可。例えばソース文書がXHTMLでもOK。
<xsl:apply-templates select="/child::xht:html/child::xht:body/child::xht:h1" mode="jtr:Structuring" />
全ての見出しはある共通の要素の子供(child)でなければなりません。
<html xmlns="http://www.w3.org/1999/xhtml">
<head><title>EX</title></head>
<body>
<h1 />
<h2 />
<h3 />
</body>
</html>
<html xmlns="http://www.w3.org/1999/xhtml">
<head><title>EX</title></head>
<body>
<h1 />
<div>
<h2 />
<div>
<h3 />
</div>
</div>
</body>
</html>
※後者の例は最初から構造化されているので、このスタイルシートを
使う意味はありません。前者の例のようなものを後者の例のように変
換するのがこのスタイルシートです。
各ノード(要素、属性等)についての変換ルールは別途用意する必要があります。
<xsl:template match="*">
<xsl:element name="{name()}">
<xsl:apply-templates select="child::node()|@*" />
</xsl:element>
</xsl:template>