1. ホーム
  2. Web プログラミング
  3. XML/RSS
  4. WMLチュートリアル

xmlにおけるスペースの完全解説

2022-01-18 01:57:33
ヒント:"xslt from Beginner to Master"のコア部分からスペースの説明について抜き出しましたので、議論に参加していただければと思います。スペースについての理解度を話してください。
xmlファイルの構造をある程度知っている学者のみを対象としており、初心者向けではありません。上から順にお読みください。
htmlファイルの場合、スペースは重要ではありませんが、xmlの場合、デフォルトの位置はスペースノードを維持します(スペースノードの説明は以下を参照)。
xmlの仕様によると、いわゆるスペースとは、4文字の並びの任意の組み合わせのことです。
---------- ---------- ---
文字値#x20に対応する空白文字(スペース)です。
キャリッジリターン、#xDの値に対応します。
改行文字。#xA の値に対応します。
値#x9に対応するタブ文字です。
xmlファイル内のスペースは、スペースノードとも呼ばれるノードを形成します。スペース・ノードは、テキスト・ノード・タイプである。
xmlとxsltの場合、スペースノードは2つのトピックを含むことができます。
---------- ---------- ---
1. xml入力ファイルの中でどのスペースが重要かを決め、xsltプロセッサーはこれらのスペースノードを見なければならない。そして、その決定のカギとなるのが、xml:space属性です。
2. xslテンプレートファイルでどのスペースが重要かを決め、xsltプロセッサはそれを結果ツリーにコピーする必要があり、その決め手となるのがxsl:strip-spaceである。
xsl:strip-spaceとxsl:preserve-spaceという2つのコマンドです。
"重要なスペースノードと重要でないスペースノード"
---------- ---------- ---
コンポーネント内のスペースノードは、そのコンポーネントのコンテンツがコンポーネント内にしか配置できない場合、重要でない(Insignificant)。
コンポーネントのコンテンツが #PCDATA 型である場合、その中のスペースノードは有意(Signficant)と見なされるべきである。
テキストコンテンツとコンポーネントが混在するコンポーネントコンテンツについては、判断のしようがなく、コンポーネントとそのコンテンツのセマンティクスに依存するはずです。
xslt プロセッサが xml 入力ファイルに触れる前に、まず xml パーサーによって解析されます。
---------- ---------- ---
(1) xml:space属性は、スペースノードの処理を引き継ぐ後続のxmlアプリケーションのモードを変更することができます。例えば、xsltプロセッサは、xml:space属性の影響を受けます。
(2) xmlファイル中の任意の列マーカーやコンテンツの末尾にある終了記号は、すべて1つの改行文字(#xA)に置き換わります。
(3) xmlパーサーは、xmlアプリケーションに与える前に、属性値も正規化する必要があります。これは、オペレーティングシステムによって、各テキスト列の末尾の文字の組み合わせが異なるためです。例えば、Windowsシステムでは、末尾の記号としてリターン文字と改行文字がありますが、Unixシステムでは改行文字のみが末尾の記号としてあります。
     xmlパーサーはxmlファイルを読み込んだ後、すべての終了記号を1つの改行文字に置き換えることで、システム間で異なっていた終了記号の設計を統一するだけでなく、その後のxmlアプリケーションの操作を簡略化することができる。この処理を「正規化」と呼びます。
 aの場合、各テキスト列の終了記号は1つの改行文字(#xA)に正規化されます。
 b, スペース文字(#x20, #xD, #xA, #x9)のいずれかを、スペース文字(#x20)1文字に置き換えること。
 c, 単語参照コードを含む属性値は、その参照文字に置き換えられるべきである。例えば、
は、改行文字(#xA)に置き換えられる。
 d, 属性値が実体参照を含む場合,その置換テキストに置換されるべきである。
 e, これら以外の文字は,正規化された属性値に直接配置するものとする。
 f, 最後に、属性タイプがCDATAでない場合、xmlパーサーはさらに一歩進んで、属性値の前後の一連の空白文字を削除し、属性値の途中に一連の空白文字がある場合は、単一の空白文字に置き換える必要があります。
xsltプロセッサがxml入力ファイルとxslテンプレートファイルの構造ツリーを構築した後、今度はコンポーネント内の隣接するテキストノードを1つのテキストノードにマージし、いくつかのテキストノードを抜き出します。ただし、テキストノードは以下の条件のいずれかを満たす場合は保持されます。
---------- ---------- ---
(1) テキストノードの親コンポーネントは、Set Of Whitespace-preserving Element Names のメンバである。
(2) リテラルノードに少なくとも1文字の非空白文字が存在する。
(3) テキストノードの祖先コンポーネントが、値がpreserveのxml:space属性を持ち、より新しい祖先コンポーネントに値がdefaultの他のxml:space属性を持たない。これ以外のテキストノードのティースは、抽象化されます。
xslテンプレートでは、いわゆるスペース保存コンポーネント名セットで利用できるxsl:textコンポーネントは1つだけです。スペースノードを含むxslテンプレートファイルは削除されますが、スペースノードがxsl:textコンポーネント内に現れると、それは保存されます。