Jintrick.netagenda2003年05月アーカイブ → 2003年05月16日

フラットな文書を構造化 その2

note::memo XSLTに関する記事内、XSLTでフラットな文書を構造化で公開されている構造化スタイルシートを見ていて、私も人様に使ってもらえそうな形にしておこうと思い立ちました。茨の道なので実際あまり薦められる物でもないのですが。

気をつけた点は以下の通りです。

structuring.xslの使い方

  1. このXSLTファイルをインクルードします。例:
    <xsl:include href="このXSLTファイルのURIまたはパス"     />
  2. インクルードしたXSLTファイルのルート要素で、名前空間 http://purl.org/jintrick/2003/XSLT を宣言します。例:
    <xsl:stylesheet xmlns:jtr="http://purl.org/jintrick/2003/XSLT"     />
  3. 構造化を展開したい任意のテンプレート内の任意の位置で、ルート要素直下のh1要素達をカレントノードリストにしつつ、mode属性を jtr:Structuring にしてapply-templatesします。例:
    <xsl:apply-templates select="/child::*/child::h1" mode="jtr:Structuring"     />

注意点など

h2レベルから構造化を開始させることも出来ます。

例:○
<xsl:apply-templates select="/child::*/child::h2" mode="jtr:Structuring"     />

特定のセクションのみを構造化することも出来ます。

例:○ id属性値が「foo」のh3のセクションのみ構造化
<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)でなければなりません。

例:○ (全てbody要素の子供になっている)
<html xmlns="http://www.w3.org/1999/xhtml">
	<head><title>EX</title></head>
	<body>
		<h1     />
		<h2     />
		<h3     />
	</body>
</html>
例:× (h1の親とh2の親、h3の親がそれぞれ違う)

<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>

webmaster@jintrick.net
公開: 2003年05月16日
カテゴリ: XSLT