ヘッダーをスキップ
Oracle XML DB開発者ガイド
10gリリース2(10.2)
部品番号: B19255-01
  目次
目次
索引
索引

戻る
戻る
次へ
次へ
 

B XPathおよびNamespaceの手引き

この付録では、W3CのXPath勧告、Namespace勧告およびInformation Set(情報セット)の概要を説明します。

この付録の内容は次のとおりです。

W3CのXPath 1.0勧告の概要

XPathは、XML文書の一部を指定するための言語であり、XSLTとXPointerの両方で使用されるように設計されています。XPathは、検索言語または問合せ言語として使用できるのみでなく、ハイパーテキスト・リンクでも使用できます。この付録で示すXPathの手引きは、W3CのXPath勧告から抜粋したものです。

XPathは、文字列、数値およびブール値の操作も簡単にします。

XPathは、簡潔な非XML構文を使用して、URIおよびXML属性値内でXPathを簡単に使用できるようにします。XPathは、XML文書の表面的な構文ではなく、その抽象的な論理構造で機能します。XPathの名前は、URLの場合と同様に、XML文書の階層構造をナビゲートするためにパス表記法を使用することから付けられています。

XML文書を指定するための使用に加えて、XPathは、照合(あるノードがあるパターンに一致しているかどうかのテスト)に使用できる一般的なサブセットを持つようにも設計されています。このようなXPathの使用については、W3CのXSLT勧告を参照してください。


注意:

今回のリリースでは、Oracle XML DBは、XPath 1.0勧告のサブセットをサポートします。ブール値、数値または文字列値を戻すXPath値はサポートしません。ただし、Oracle XML DBは、述語内でこれらのXPath型をサポートします。

XPathによるXML文書のノードのツリーとしてのモデル化

XPathは、XML文書をノードのツリーとしてモデル化します。ノードには、要素ノード、属性ノード、テキスト・ノードなどの様々な型があります。XPathは、それぞれの型のノードについて、その文字列値を計算する方法を定義します。ノードの型には、名前を持つものもあります。XPathは、XML名前空間を完全にサポートします。そのため、ノードの名前は、1つのローカル部分およびNULLの可能性がある1つの名前空間URIで構成されるペアとしてモデル化されます。これを拡張名といいます。データ・モデルの詳細は、「XPath 1.0のデータ・モデル」を参照してください。XML名前空間の概要については、「W3CのXML Namespace勧告の概要」を参照してください。


関連資料:


XPath式

XPathの構文は、主に式で構成されます。式は、生成規則Exprと一致します。式は評価されてオブジェクトを生成しますが、このオブジェクトは次の4つの基本型の1つを持ちます。

コンテキストに関連した式の評価

式の評価は、コンテキストに関連して行われます。XSLTおよびXPointerは、それぞれXSLTおよびXPointerで使用されるXPath式に対するコンテキストを決定する方法を指定します。コンテキストは次のもので構成されます。

  • ノード(コンテキスト・ノード)。

  • 0(ゼロ)以外の正の整数の組(コンテキスト位置およびコンテキスト・サイズ)。コンテキスト位置は、常にコンテキスト・サイズ以下です。

  • 変数バインディングのセット。これらのバインディングは、変数名から変数値へのマッピングで構成されます。変数の値はオブジェクトです。このオブジェクトは、式の値に使用可能などの型であることもでき、ここでは指定されていない追加の型であることもできます。

  • 関数ライブラリ。このライブラリは、関数名から関数へのマッピングで構成されます。各関数は、0(ゼロ)個以上の引数を取り、単一の結果を戻します。すべてのXPath実装がサポートする必要があるコア関数ライブラリの定義については、XPath勧告を参照してください。コア関数ライブラリの関数の場合、変数および結果は次の4つの基本型になります。

    • ノード・セット関数

    • 文字列関数

    • ブール関数

    • 数値関数

    XSLTとXPointerは、両方とも追加の関数を定義することによってXPathを拡張します。これらの関数には、4つの基本型に機能するものがあります。また、XSLTやXPointerによって定義された追加のデータ型に機能するものもあります。

  • 式の有効範囲内にある名前空間宣言のセット。これらの名前空間宣言は、接頭辞から名前空間URIへのマッピングで構成されます。

部分式の評価

部分式を評価するために使用される変数バインディング、関数ライブラリおよび名前空間宣言は、その部分式を含む式を評価するために使用されるものと常に同じです。

部分式を評価するために使用されるコンテキスト・ノード、コンテキスト位置およびコンテキスト・サイズは、その部分式を含む式を評価するために使用されるものと異なる場合があります。いくつかの種類の式は、コンテキスト・ノードを変更します。コンテキスト位置およびコンテキスト・サイズを変更するのは、述語のみです。ある種類の式の評価を記述する場合、部分式の評価に対してコンテキスト・ノード、コンテキスト位置およびコンテキスト・サイズが変更されるときは、常に明示的に示します。コンテキスト・ノード、コンテキスト位置およびコンテキスト・サイズについて記述しない場合は、その種類の式の部分式の評価に対して変更されないままです。

XML属性内に頻繁に出現するXPath式

この項に指定されている文法は、XML 1.0正規化の後の属性値に適用されます。そのため、たとえば、文法で小なり記号(<)という文字が使用される場合、この文字はXMLソース内では小なり記号として表すことはできませんが、XML 1.0の規則に従って&#amp;lt;などとして入力することにより引用される必要があります。

式内では、リテラル文字列は一重引用符または二重引用符によって区切られます。これらの引用符は、XML属性の区切るためにも使用されます。XMLプロセッサによって式内の引用符が属性値の終了として解析されることを回避するため、次の機能があります。

  • 引用符は、文字参照(&#amp;quot;または&#amp;apos;)として入力できます。

  • XML属性が二重引用符で区切られている場合、式は一重引用符を使用でき、XML属性が一重引用符で区切られている場合、式は二重引用符を使用できます。

ロケーション・パス

式の種類のうち重要なものの1つは、ロケーション・パスです。ロケーション・パスとは、取る必要があるルートです。ルートは、方向およびいくつかのステップで構成される場合があります。それぞれのステップは、「/」で区切られています。

ロケーション・パスは、コンテキスト・ノードに対する相対的なノードの集合を選択します。ロケーション・パスである式を評価した結果は、そのロケーション・パスによって選択されたノードを含むノードセットです。

ロケーション・パスは、ノードの集合をフィルタするために使用される式を再帰的に含むことができます。ロケーション・パスは、生成規則LocationPathと一致します。

式の解析は、まず解析する文字列をトークンに分割し、結果の一連のトークンを解析することによって行われます。空白は、トークン間で自由に使用できます。

ロケーション・パスはXPath内で最も一般的な文法構成メンバーではありません(LocationPathはExprの特殊なケースです)が、最も重要な構成メンバーです。

ロケーション・パスの構文の省略形

どのロケーション・パスも、単純で冗長的な構文を使用して表現できます。また、一般的なケースを簡潔に表現できる多くの構文の省略形もあります。この項の内容は次のとおりです。

非省略構文を使用したロケーション・パスの例

表B-1に、非省略構文を使用したロケーション・パスの例を示します。

表B-1 XPath: 非省略構文を使用したロケーション・パスの例

非省略ロケーション・パス 説明
child::para コンテキスト・ノードのpara子要素を選択します。
child::* コンテキスト・ノードのすべての子要素を選択します。
child::text() コンテキスト・ノードのすべての子テキスト・ノードを選択します。
child::node() ノードの型に関係なく、コンテキスト・ノードのすべての子を選択します。
attribute::name コンテキスト・ノードのname属性を選択します。
attribute::* コンテキスト・ノードのすべての属性を選択します。
nodedescendant::para コンテキスト・ノードのpara子孫要素を選択します。
ancestor::div コンテキスト・ノードのすべてのdiv祖先要素を選択します。
ancestor-or-self::div コンテキスト・ノードのdiv祖先要素を選択し、コンテキスト・ノードがdiv要素である場合は、そのコンテキスト・ノードも選択します。
descendant-or-self::para コンテキスト・ノードのpara子孫要素を選択し、コンテキスト・ノードがpara要素である場合は、そのコンテキスト・ノードも選択します。
self::para コンテキスト・ノードがpara要素である場合は、そのコンテキスト・ノードを選択します。それ以外の場合は、何も選択しません。
child::chapter/descendant::para コンテキスト・ノードのchapter子要素のpara子孫要素を選択します。
child::*/child::para コンテキスト・ノードのすべてのpara孫要素を選択します。
/
常に文書要素の親であるドキュメント・ルートを選択します。
/descendant::para コンテキスト・ノードと同じドキュメント内に存在するすべてのpara要素を選択します。
/descendant::olist/child::item olist親要素を持ち、コンテキスト・ノードと同じドキュメント内に存在するすべてのitem要素を選択します。
child::para[position()=1] コンテキスト・ノードの最初のpara子要素を選択します。
child::para[position()=last()] コンテキスト・ノードの最後のpara子要素を選択します。
child::para[position()=last()-1] コンテキスト・ノードで最後から2番目のpara子要素を選択します。
child::para[position()>1] 最初のpara子要素以外の、コンテキスト・ノードのすべてのpara子要素を選択します。
following-sibling::chapter[position()=1] コンテキスト・ノードの次のchapter兄弟要素を選択します。
preceding-sibling::chapter[position()=1] コンテキスト・ノードの前のchapter兄弟要素を選択します。
/descendant::figure[position()=42] ドキュメントの42番目のfigure要素を選択します。
/child::doc/child::chapter[position()=5]/child::section [position()=2] doc文書要素の5番目のchapterの2番目のsectionを選択します。
child::para[attribute::type="warning"] コンテキスト・ノードの、warningという値を持つtype属性を含むすべてのpara子要素を選択できます。
child::para[attribute::type='warning'][position()=5] コンテキスト・ノードの、warningという値を持つtype属性を含む5番目のpara子要素を選択できます。
child::para[position()=5][attribute::type= "warning"] コンテキスト・ノードの5番目のpara子要素がwarningという値を持つtype属性を含む場合、そのpara子要素を選択します。
child::chapter[child::title='Introduction'] コンテキスト・ノードの、Introduction文字列値を持つ1つ以上のtitle子要素を含むchapter子要素を選択します。
child::chapter[child::title] コンテキスト・ノードの、1つ以上のtitle子要素を含むchapter子要素を選択します。
child::*[self::chapter or self::appendix] コンテキスト・ノードのchapter子要素およびappendix子要素を選択します。
child::*[self::chapter or self::appendix][position()=last()] コンテキスト・ノードのchapter子要素またはappendix子要素を選択します。

省略構文を使用したロケーション・パスの例

表B-2に、省略構文を使用したロケーション・パスの例を示します。

表B-2 XPath: 省略構文を使用したロケーション・パスの例

省略ロケーション・パス 説明
para コンテキスト・ノードのpara子要素を選択します。
*
コンテキスト・ノードのすべての子要素を選択します。
text() コンテキスト・ノードのすべての子テキスト・ノードを選択します。
@name コンテキスト・ノードのname属性を選択します。
@*
コンテキスト・ノードのすべての属性を選択します。
para[1] コンテキスト・ノードの最初のpara子要素を選択します。
para[last()] コンテキスト・ノードの最後のpara子要素を選択します。
*/para コンテキスト・ノードのすべてのpara孫要素を選択します。
/doc/chapter[5]/section[2] doc文書要素の5番目のchapterの2番目のsectionを選択します。
chapter//para コンテキスト・ノードのchapter子要素のpara子孫要素を選択します。
//para ドキュメント・ルートのすべてのpara子孫要素を選択します。したがって、コンテキスト・ノードと同じドキュメント内に存在するすべてのpara要素を選択します。
//olist/item コンテキスト・ノードと同じドキュメント内に存在する、olist親要素を持つすべてのitem要素を選択します。
. コンテキスト・ノードを選択します。
.//para コンテキスト・ノードのpara子孫要素を選択します。
.. コンテキスト・ノードの親を選択します。
../@lang コンテキスト・ノードの親のlang属性を選択します。
para[@type="warning"] コンテキスト・ノードの、warningという値を持つtype属性を含むすべてのpara子要素を選択できます。
para[@type="warning"][5] コンテキスト・ノードの、warningという値を持つtype属性を含む5番目のpara子要素を選択できます。
para[5][@type="warning"] コンテキスト・ノードの5番目のpara子要素がwarningという値を持つtype属性を含む場合、そのpara子要素を選択します。
chapter[title="Introduction"] コンテキスト・ノードの、Introduction文字列値を持つ1つ以上のtitle子要素を含むchapter子要素を選択します。
chapter[title] コンテキスト・ノードの、1つ以上のtitle子要素を含むchapter子要素を選択します。
employee[@secretary and @assistant] コンテキスト・ノードの、secretary属性とassistant属性の両方を持つemployee子要素を選択します。

最も重要な省略は、child::をロケーション・ステップから省略できるということです。実際には、childはデフォルトの軸です。たとえば、div/paraというロケーション・パスはchild::div/child::paraの短縮形です。

属性の省略形@

属性にも省略形があります。attribute::はアットマーク(@)に省略できます。

たとえば、para[@type="warning"]というロケーション・パスは、child::para[attribute::type="warning"]の短縮形であるため、warningと等しい値を持つtype属性を含むpara子要素を選択します。

パスの省略形//

//は、/descendant-or-self::node()/の短縮形です。たとえば、//paraは、/descendant-or-self::node()/child::paraの短縮形であるため、ドキュメント内の任意のpara要素を選択します(文書要素ノードはルート・ノードの子であるため、文書要素であるpara要素でも//paraによって選択されます)。

div//paraは、div/descendant-or-self::node()/child::paraの短縮形であるため、div子要素のすべてのpara子孫要素を選択します。


注意:

//para[1]というロケーション・パスは、/descendant::para[1]というロケーション・パスと同じ意味ではありません。/descendant::para[1]は、最初のpara子孫要素を選択します。//para[1]は、その親の最初のpara子要素であるすべてのpara子孫要素を選択します。

ロケーション・ステップの省略形.

ピリオド(.)のロケーション・ステップは、self::node()の短縮形です。これは、特に//とともに使用すると効果的です。たとえば、.//paraというロケーション・パスは、次のロケーション・パスの短縮形です。

self::node()/descendant-or-self::node()/child::para

したがって、この短縮形は、コンテキスト・ノードのすべてのpara子孫要素を選択します。

ロケーション・ステップの省略形..

同様に、2つのピリオド(.)というロケーション・ステップは、parent::node()の短縮形です。たとえば、../titleは次のロケーション・パスの短縮形です。

parent::node()/child::title

したがって、この短縮形は、コンテキスト・ノードの親のtitle子要素を選択します。

省略形の概要

AbbreviatedAbsoluteLocationPath ::= '//' RelativeLocationPath

AbbreviatedRelativeLocationPath ::= RelativeLocationPath '//' Step

AbbreviatedStep ::= '.' | '..'

AbbreviatedAxisSpecifier ::= '@'?

相対ロケーション・パスおよび絶対ロケーション・パス

ロケーション・パスには2つの種類があります。

  • 相対ロケーション・パス:相対ロケーション・パスは、/で区切られた1つ以上のロケーション・ステップのシーケンスで構成されます。相対ロケーション・パス内のステップは、左から右に合成されます。次に、各ステップは、コンテキスト・ノードに対して相対的にノードの集合を選択します。ステップのシーケンスの先頭部分は、次のとおり、以降のステップと合成されます。ステップのシーケンスの先頭部分は、コンテキスト・ノードに対して相対的にノードの集合を選択します。その集合内の各ノードは、次のステップのコンテキスト・ノードとして使用されます。そのステップによって識別されたノードの集合が1つに統合されます。ステップを合成したものによって識別されたノードの集合は、この共用体です。

    たとえば、child::div/child::paraは、コンテキスト・ノードのdiv子要素のpara子要素(div親要素を持つpara孫要素)を選択します。

  • 絶対ロケーション・パス:絶対ロケーション・パスは、/と、その後にオプションで続く相対ロケーション・パスで構成されます。/自体は、コンテキスト・ノードを含むドキュメントのルート・ノードを選択します。その後に相対ロケーション・パスが続いている場合、そのロケーション・パスは、コンテキスト・ノードを含むドキュメントのルート・ノードに対して相対的に相対ロケーション・パスによって選択されるノードの集合を選択します。

ロケーション・パスの構文の概要

ロケーション・パスは、ターゲット・ノードを検索する方法を提供します。次に、ロケーション・パスの一般的な構文を示します。

axisname :: nodetest expr1 expr2 ...

LocationPath             ::=    RelativeLocationPath
                              | AbsoluteLocationPath
AbsoluteLocationPath     ::=    '/' RelativeLocationPath?
                              | AbbreviatedAbsoluteLocationPath
RelativeLocationPath     ::=    Step
                              | RelativeLocationPath '/' Step
                              | AbbreviatedRelativeLocationPath

XPath 1.0のデータ・モデル

XPathは、ツリーとしてのXML文書に機能します。この項では、XPathがXML文書をツリーとしてモデル化する方法について説明します。XPathによって操作されるXML文書に対するこのモデルの関連性は、XML Namespace勧告に準拠している必要があります。

ノード

ツリーにはノードが含まれます。ノードには7つのタイプがあります。

ルート・ノード

ルート・ノードは、ツリーのルートです。ルート・ノードは、ツリーのルートとして以外は出現しません。文書要素の要素ノードは、ルート・ノードの子です。ルート・ノードは、プロローグ内や、文書要素の末尾の後に出現する処理命令(PI)およびコメントを処理するための、子処理命令ノードおよび子コメント・ノードも持ちます。ルート・ノードの文字列は、ルート・ノードのすべての子孫テキスト・ノードの文字列値をドキュメント順に連結したものです。ルート・ノードは拡張名を持ちません。

要素ノード

ドキュメント内の要素ごとに1つの要素ノードが存在します。要素ノードは、XML Namespace勧告に従って、タグ内に指定されている要素のQNameを拡張することによって計算された拡張名を持ちます。要素の拡張名の名前空間URIは、QNameに接頭辞がなく、適用可能なデフォルトの名前空間がない場合、NULLになります。


注意:

http://www.w3.org/TR/REC-xml-names/の付録A.3の表記法では、拡張名のローカル部分はExpEType要素のtype属性に対応します。拡張名の名前空間URIは、ExpEType要素のns属性に対応し、ExpEType要素のns属性が省略されている場合はNULLです。

要素ノードの子は、要素ノード、コメント・ノード、処理命令ノード、およびその内容に対するテキスト・ノードです。内部エンティティと外部エンティティの両方に対する実体参照は、拡張されます。文字参照は解決されます。要素ノードの文字列は、要素ノードのすべての子孫テキスト・ノードの文字列値をドキュメント順に連結したものです。

一意のID:要素ノードは、一意の識別子(ID)を持つことができます。これは、Document Type Definition(DTD)でID型として宣言されている属性の値です。1つのドキュメント内で2つの要素が同じ一意のIDを持つことはできません。XMLプロセッサが1つのドキュメント内の2つの要素が同じ一意のIDを持っていること(これは、ドキュメントが妥当でない場合にのみ可能です)を通知した場合、そのドキュメント順の2番目の要素は一意のIDを持っていないものとして処理される必要があります。


注意:

ドキュメントがDTDを持たない場合、そのドキュメント内のどの要素も一意のIDを持ちません。

テキスト・ノード

文字データは、テキスト・ノードにグループ化されます。各テキスト・ノードには、可能なかぎり多くの文字データがグループ化されます。テキスト・ノードが、テキスト・ノードである直前または直後の兄弟を持つことはありません。テキスト・ノードの文字列値は、文字データです。テキスト・ノードは、常に1文字以上のデータを持ちます。CDATAセクション内の各文字は、文字データとして処理されます。したがって、ソース・ドキュメント内の<![CDATA[<]]>は、&#amp;lt;と同様に処理されます。どちらの結果も、ツリーのテキスト・ノードでは単一の<文字になります。そのため、CDATAセクションは、<![CDATA[および]]>が削除され、<および&#amp;が出現するたびにそれぞれ&#amp;lt; および&#amp;amp;に置き換えられたときと同様に処理されます。


注意:

<文字を含むテキスト・ノードがXMLとして書き出される場合、<文字の前に置く必要のあるエスケープ文字は&#amp;ltを使用したり、それをCDATAセクション内に組み込むことによってエスケープする必要があります。コメント、処理命令および属性値内の文字は、テキスト・ノードを生成しません。外部エンティティ内の行端は、XML勧告で指定されているとおり、#xAに正規化されます。テキスト・ノードは拡張名を持ちません。

属性ノード

各要素ノードは、関連付けられた属性ノードの集合を持ちます。要素は、これらの各属性ノードの親です。ただし、属性ノードはその親要素の子ではありません。


注意:

これはドキュメント・オブジェクト・モデル(DOM)とは異なります。DOMは、属性を持つ要素をその属性の親として処理しません。

要素が属性ノードを共有することはありません。1つの要素ノードが別の要素ノードと同じノードではない場合、片方の要素ノードの属性ノードはすべて、もう1つの要素ノードの属性ノードと同じノードではありません。


注意:

=演算子は、2つのノードが同じノードであるかどうかではなく、それらが同じ値を持つかどうかをテストします。したがって、2つの異なる要素の属性は、同じノードでない場合でも、=を使用して等しいものとして比較される場合があります。

デフォルトの属性は、指定された属性と同様に処理されます。DTDで要素型に対して属性を宣言した場合でも、デフォルトを#IMPLIEDとして宣言し、その要素に対して属性を指定しなかった場合、その要素の属性セットにその属性のノードは含まれません。

xml:langxml:spaceなどの一部の属性は、別の子孫要素に対する同じ属性のインスタンスによってオーバーライドされないかぎり、その属性を持つ要素の子孫であるすべての要素に適用されます。ただし、これはツリー内での属性ノードの出現位置に影響しません。要素は、その要素の開始タグまたは空要素タグで明示的に指定された属性、またはDTDでデフォルト値を使用して明示的に宣言された属性に対してのみ、属性ノードを持ちます。

属性ノードは、拡張名および文字列値を持ちます。拡張名は、XML Namespace勧告に従って、XML文書のタグ内に指定されているQNameを拡張することによって計算されます。属性のQNameに接頭辞がない場合、属性名の名前空間URIはNULLになります。


注意:

XML Namespace勧告の付録A.3の表記法では、拡張名のローカル部分はExpAName要素のname属性に対応します。拡張名の名前空間URIは、ExpAName要素のns属性に対応し、ExpAName要素のns属性が省略されている場合はNULLです。

属性ノードは文字列値を持ちます。この文字列値は、XML勧告によって指定されているとおり、正規化された値です。正規化された値が長さ0(ゼロ)の文字列である属性は、特別に処理されることはありません。この属性は、結果として文字列値に長さ0(ゼロ)の文字列を持つ属性ノードになります。


注意:

デフォルトの属性は、外部DTDまたは外部パラメータ・エンティティで宣言できます。XML勧告では、検証を行わないXMLプロセッサは、外部DTDまたは外部パラメータを読み込む必要はありません。XPathツリーに外部DTDまたは外部パラメータ・エンティティで宣言されたデフォルトの属性値が含まれることを前提とするスタイルシートまたは他の機能は、検証を行わない一部のXMLプロセッサでは機能しない場合があります。

名前空間を宣言する属性に対応する属性ノードはありません。

名前空間ノード

各要素は、関連付けられた名前空間ノードの集合を持ちます。名前空間ノードは、要素の有効範囲内にある個別の名前空間接頭辞(XML Namespace勧告によって暗黙的に宣言されているxml接頭辞など)ごとに1つ、およびデフォルトの名前空間が要素の有効範囲内にある場合は、それに対して1つです。要素は、これらの各名前空間ノードの親です。ただし、名前空間ノードは、その親要素の子ではありません。

要素が名前空間ノードを共有することはありません。1つの要素ノードが別の要素ノードと同じノードではない場合、片方の要素ノードの名前空間ノードはすべて、もう1つの要素ノードの名前空間ノードと同じノードではありません。これは、要素が次のものに対して名前空間ノードを持つことを意味します。

  • 名前がxmlns:で始まる要素の各属性

  • 要素自体またはより近い祖先がその接頭辞を再宣言していないかぎり、名前がxmlns:で始まる祖先要素の各属性

  • 要素または祖先がxmlns属性を持ち、最も近いそのような要素のxmlns属性の値が空でない場合、xmlns属性


    注意:

    属性xmlns=""は、デフォルトの名前空間の宣言を取り消します。

名前空間ノードは拡張名を持ちます。ローカル部分は、名前空間接頭辞です(名前空間ノードがデフォルトの名前空間用である場合は空です)。名前空間URIは、常にNULLです。

名前空間ノードの文字列値は、名前空間接頭辞にバインドされている名前空間URIです。その名前空間URIが相対URIである場合、拡張名の名前空間URIと同様に解決される必要があります。

処理命令ノード

ドキュメント・タイプ宣言内に出現する処理命令を除き、処理命令ごとに処理命令ノードが存在します。処理命令は拡張名を持ちます。ローカル部分は、処理命令のターゲットです。名前空間URIはNULLです。処理命令ノードの文字列値は、処理命令のうちのターゲットと空白に続く部分です。最後の?>は、この文字列値に含まれません。


注意:

XML宣言は、処理命令ではありません。したがって、XML宣言に対応する処理命令ノードはありません。

コメント・ノード

ドキュメント・タイプ宣言内に出現するコメントを除き、コメントごとにコメント・ノードがあります。コメントの文字列値は、開始の<!--または終了の-->を含まない、コメントの内容です。コメント・ノードは拡張名を持ちません。

ノードの文字列値を決定する方法は、ノードのタイプによって異なります。ノードのタイプによって、文字列値がそのノードの一部となるものもあり、文字列値が子孫ノードの文字列値から計算されるものもあります。


注意:

要素ノードおよびルート・ノードの場合、ノードの文字列値は、DOM nodeValueメソッドによって戻される文字列と同じではありません。

拡張名

ノードのタイプによっては、拡張名を持つものもあります。拡張名は、次のもので構成されます。

  • ローカル部分。これは文字列です。

  • 名前空間URI。名前空間URIは、NULLまたは文字列のいずれかです。XML文書で指定された名前空間URIは、RFC2396で定義されているとおり、URI参照として使用できます。これは、名前空間URIがフラグメント識別子を持ち、相対URIとして使用できることを意味します。相対URIは、名前空間の処理中に絶対URIに解決される必要があります。データ・モデル内のノードが持つ拡張名の名前空間URIは、絶対URIである必要があります。

2つの拡張名が同じローカル部分を持ち、どちらもNULLの名前空間URIを持つか、または等しい名前空間URIを持つ場合、その2つの拡張名は等しくなります。

ドキュメント順

ドキュメント順という順序付けがあります。これは、ドキュメント内のすべてのノードで定義され、汎用エンティティの拡張後にドキュメントのXML表現内で、各ノードのXML表現の最初の文字が出現する順序に対応しています。したがって、ルート・ノードが最初のノードになります。

要素ノードは、その子より前に出現します。したがって、ドキュメント順では、(エンティティの拡張後に)XML内で要素ノードの開始タグが出現した順に要素ノードが順序付けされます。要素の属性ノードおよび名前空間ノードは、その要素の子より前に出現します。名前空間ノードは、属性ノードより前に出現するように定義されます。

名前空間ノードの相対的な順序は、実装に依存します。

属性ノードの相対的な順序は、実装に依存します。

逆ドキュメント順は、ドキュメント順を逆にしたものです。

ルート・ノードおよび要素ノードは、子ノードの順序付けられたリストを持ちます。ノードが子を共有することはありません。1つのノードが別のノードと同じノードではない場合、片方のノードの子はすべて、もう1つのノードのどの子とも同じノードではありません。

ルート・ノード以外のすべてのノードは、親を1つのみ持ちます。その親は、要素ノードまたはルート・ノードのどちらかです。ルート・ノードまたは要素ノードは、その各子ノードの親です。ノードの子孫とは、そのノードの子、およびそのノードの子の子孫です。

W3CのXML Namespace勧告の概要

他のソフトウェア・パッケージ用のマークアップで同じ要素型または属性名が使用されている場合に名前の衝突が発生したときでも、ソフトウェア・モジュールは、処理対象として設計されているタグおよび属性を認識できる必要があります。

文書の構成メンバーは、この汎用名を持つ必要があります。汎用名の有効範囲は、それらの構成メンバーを含む文書を含み、それ以外のものにも適用されます。これを実現するXML名前空間というメカニズムについては、W3CのXML Namespace勧告を参照してください。

名前空間の概要

XML名前空間とは、URI参照(RFC2396)によって識別され、XML文書内で要素型および属性名として使用される名前の集合です。XML名前空間は、内部構造を持ち、数学的には集合ではないという点で、コンピューティング分野で一般的に使用される名前空間とは異なります。この問題については、W3CのNamespace勧告の付録「A. The Internal Structure of XML Namespaces」(XML名前空間の内部構造)を参照してください。

URI参照

名前空間を識別するURI参照は、文字ごとに完全に同じである場合、同一とみなされます。この意味で同一でないURI参照も、実際には機能的に同等である場合があることに注意してください。この例には、大/小文字のみが異なるURI参照、または異なる有効なベースURIを持つ外部エンティティ内のURI参照があります。

XML名前空間からの名前は、修飾名として出現できます。この修飾名には、その名前を名前空間接頭辞とローカル部分に分離する単一のコロンが含まれます。

URI参照にマップされた接頭辞が、名前空間を選択します。普遍的に管理されるURI名前空間とドキュメントの名前空間の組合せによって、普遍的に一意の識別子が生成されます。また、接頭辞の有効範囲決定およびデフォルト設定のためのメカニズムが提供されます。

URI参照は、名前には使用できない文字を含むことができるため、名前空間接頭辞として直接使用することはできません。そのため、名前空間接頭辞はURI参照のプロキシとして機能します。名前空間接頭辞とURI参照の関連付けを宣言するために、次の項に示す属性ベースの構文が使用されます。この名前空間提案をサポートするソフトウェアは、これらの宣言および接頭辞を認識し、それらに対して機能する必要があります。

表記法および使用方法

この仕様の生成規則内の多くの非終端記号は、この仕様ではなく、W3CのXML勧告で定義されています。この仕様で定義される非終端記号がW3CのXML勧告で定義されている非終端記号と同じ名前を持つ場合、この仕様での生成規則は、すべての場合で、W3CのXML勧告の対応する生成規則に一致する文字列のサブセットと一致します。

この仕様の生成規則でNSCは、この仕様に準拠するドキュメントが従う必要がある規則の1つである名前空間制約のことです。

例で使用するすべてのインターネット・ドメイン名は、w3.org以外はランダムに選択されたものであり、特別な意味を持つものではありません。

名前空間の宣言

名前空間は、予約済属性のグループを使用して宣言されます。このような属性の名前は、xmlnsであるか、または接頭辞としてxmlns:を持つ必要があります。これらの属性は、他のXML属性と同様に、直接またはデフォルトで提供されます。

名前空間宣言用の属性名

[1] NSAttName ::=    PrefixedAttName
                     | DefaultAttName
[2] PrefixedAttName ::= 'xmlns:' NCName [NSC: Leading "XML" ]
[3] DefaultAttName ::= 'xmlns'
[4] NCName ::= (Letter | '_') (NCNameChar)*   /* An XML Name, minus the ":" */
[5] NCNameChar ::= Letter | Digit | '.' | '-' | '_' | CombiningChar | Extender

URI参照である属性の値は、名前空間を識別する名前空間名です。名前空間名は、その目的を果たすために、一意性および永続性という特長を持つ必要があります。名前空間名をスキーマ(存在する場合)の取出しに直接使用できることが目的ではありません。これらの目的を想定して設計された構文の例には、Uniform Resource Name(RFC2141)の構文があります。ただし、通常のURLも、同じこれらの目的を達成するように管理できることに注意してください。

属性名がPrefixedAttNameと一致する場合

属性名がPrefixedAttNameと一致する場合、NCNameによって接頭辞が与えられます。この接頭辞は、宣言が指定されている要素の有効範囲内にある属性値の名前空間名に要素名および属性名を関連付けるために使用されます。このような宣言では、名前空間名は空であることはできません。

属性名がDefaultAttNameと一致する場合

属性名がDefaultAttNameと一致する場合、その属性値の名前空間名は、宣言が指定されている要素の有効範囲内にあるデフォルトの名前空間の名前空間名です。このようなデフォルトの宣言では、属性値は空であることができます。デフォルトの名前空間および宣言のオーバーライドについては、「要素および属性への名前空間の適用」(W3CのNamespace勧告)を参照してください。

次の名前空間宣言の例は、名前空間接頭辞ediを名前空間名http://ecommerce.org/schemaに関連付けます。

<x xmlns:edi='http://ecommerce.org/schema'>
  <!-- the "edi" prefix is bound to http://ecommerce.org/schema
       for the "x" element and contents -->
</x>

名前空間制約: X、M、Lで始まる接頭辞

3つの文字x、mおよびlの大/小文字を任意に組み合せたシーケンスで始まる接頭辞は、XML仕様およびXML関連仕様で使用するために予約済です。

修飾名

W3CのNamespace勧告に準拠するXML文書では、いくつかの名前(非終端記号Nameに対応する構成メンバー)を、次のとおり定義される修飾名として与えることができます。

修飾名の構文

[6] QName ::= (Prefix ':')? LocalPart
[7] Prefix ::= NCName
[8] LocalPart::= NCName

接頭辞の概要

Prefixは、修飾名の名前空間接頭辞部分を提供し、名前空間宣言内の名前空間URI参照に関連付けられる必要があります。

LocalPartは、修飾名のローカル部分を提供します。接頭辞は名前空間名のプレースホルダとしてのみ機能することに注意してください。有効範囲がその名前を含む文書とそれ以外のものにも適用される名前を構成する場合、アプリケーションは、接頭辞ではなく名前空間名を使用する必要があります。

修飾名の使用

W3CのNamespace勧告に準拠するXML文書では、要素型は、次のとおり修飾名として与えられます。

要素型

[9]  STag ::= '<' QName (S Attribute)* S? '>' [NSC: Prefix Declared ]
[10] ETag::= '</' QName S? '>'[NSC: Prefix Declared ]
[11] EmptyElemTag ::= '<' QName (S Attribute)* S? '/>' [NSC: Prefix Declared ]

次に、要素型として機能する修飾名の例を示します。

<x xmlns:edi='http://ecommerce.org/schema'>
  <!-- namespace of 'price' element is http://ecommerce.org/schema -->
  <edi:price units='Euro'>32.18</edi:price>
</x>

属性は、名前空間宣言か、またはその属性の名前が修飾名として与えられたもののどちらかです。

属性

[12] Attribute::= NSAttName Eq AttValue|QName Eq AttValue [NSC:Prefix Declared]

次に、属性名として機能する修飾名の例を示します。

<x xmlns:edi='http://ecommerce.org/schema'>
   <!-- namespace of 'taxClass' attribute is http://ecommerce.org/schema -->
   <lineItem edi:taxClass="exempt">Baby food</lineItem>
</x>

名前空間制約: 宣言された接頭辞

名前空間接頭辞は、xmlまたはxmlnsでないかぎり、その接頭辞を使用する要素の開始タグまたは祖先要素(接頭辞付きのマークアップがその内容に出現する要素)の名前空間宣言属性で宣言されている必要があります。

接頭辞xmlは、定義上、名前空間名http://www.w3.org/XML/1998/namespaceにバインドされます。

接頭辞xmlnsは、名前空間バインディングのみに使用され、それ自体はどの名前空間名にもバインドされません。

この制約は、名前空間宣言属性が直接XML文書エンティティ内ではなく、外部エンティティ内で宣言されたデフォルトの属性を介して提供される場合、操作上の問題を発生させる場合があります。このような宣言は、検証を行わないXMLプロセッサに基づくソフトウェアでは読み込まれない場合があります。

多くのXMLアプリケーションは、名前空間を認識できるものを含め、検証プロセッサを正常に要求できません。このようなアプリケーションで正しく操作するために、名前空間宣言は、直接提供されるか、またはDTDの内部サブセットで宣言されたデフォルトの属性を介して提供される必要があります。

要素名および属性型は、DTD内の宣言に出現する場合にも、修飾名として与えられます。

宣言内の修飾名

[13] doctypedecl::= '<!DOCTYPE' S QName (S ExternalID)? S? ('[' (markupdecl |
                     PEReference | S)* ']' S?)? '>'
[14] elementdecl::= '<!ELEMENT' S QName S contentspec S? '>'
[15] cp         ::= (QName | choice | seq) ('?' | '*' | '+')?
[16] Mixed      ::= '(' S? '#PCDATA' (S? '|' S? QName)* S? ')*'
                     | '(' S? '#PCDATA' S? ')'
[17] AttlistDecl::= '<!ATTLIST' S QName AttDef* S? '>'
[18] AttDef     ::=  S (QName | NSAttName) S AttType S DefaultDecl

要素および属性への名前空間の適用

この項では、名前空間を要素および属性に適用する方法を説明します。

名前空間の有効範囲決定

名前空間宣言は、同じNSAttName部分を持つ別の名前空間宣言によってオーバーライドされないかぎり、それが指定された要素、およびその要素の内容に存在するすべての要素に適用されます。

<?xml version="1.0"?>
  <!-- all elements here are explicitly in the HTML namespace -->
  <html:html xmlns:html='http://www.w3.org/TR/REC-html40'>
    <html:head><html:title>Frobnostication</html:title></html:head>
    <html:body><html:p>Moved to
      <html:a href='http://frob.com'>here.</html:a></html:p></html:body>
</html:html>

次の例に示すとおり、複数の名前空間接頭辞を単一の要素の属性として宣言できます。

<?xml version="1.0"?>
  <!-- both namespace prefixes are available throughout -->
  <bk:book xmlns:bk='urn:loc.gov:books'
           xmlns:isbn='urn:ISBN:0-395-36341-6'>
      <bk:title>Cheaper by the Dozen</bk:title>
      <isbn:number>1568491379</isbn:number>
  </bk:book>

名前空間のデフォルト設定

デフォルトの名前空間は、それが宣言された要素(その要素が名前空間接頭辞を持たない場合)、およびその要素の内容に存在する接頭辞を持たないすべての要素に適用されます。デフォルトの名前空間宣言内のURI参照が空である場合、その宣言の有効範囲内の接頭辞がない要素は、どの名前空間にも存在しないとみなされます。デフォルトの名前空間は、直接属性には適用されないことに注意してください。

<?xml version="1.0"?>
  <!-- elements are in the HTML namespace, in this case by default -->
  <html xmlns='http://www.w3.org/TR/REC-html40'>
    <head><title>Frobnostication</title></head>
    <body><p>Moved to
      <a href='http://frob.com'>here</a>.</p></body>
  </html>

<?xml version="1.0"?>
  <!-- unprefixed element types are from "books" -->
  <book xmlns='urn:loc.gov:books'
        xmlns:isbn='urn:ISBN:0-395-36341-6'>
      <title>Cheaper by the Dozen</title>
      <isbn:number>1568491379</isbn:number>
  </book>

次に、名前空間の有効範囲決定のより大きい例を示します。

<?xml version="1.0"?>
  <!-- initially, the default namespace is "books" -->
  <book xmlns='urn:loc.gov:books'
        xmlns:isbn='urn:ISBN:0-395-36341-6'>
      <title>Cheaper by the Dozen</title>
      <isbn:number>1568491379</isbn:number>
      <notes>
        <!-- make HTML the default namespace for some commentary -->
        <p xmlns='urn:w3-org-ns:HTML'>
            This is a <i>funny</i> book!
        </p>
      </notes>
  </book>

デフォルトの名前空間は、空の文字列に設定できます。これは、その宣言の有効範囲内では、デフォルトの名前空間が存在しない場合と同じ効果があります。

<?xml version="1.0"?>
  <Beers>
    <!-- the default namespace is now that of HTML -->
    <table xmlns='http://www.w3.org/TR/REC-html40'>
     <th><td>Name</td><td>Origin</td><td>Description</td></th>
     <tr>
       <!-- no default namespace inside table cells -->
       <td><brandName xmlns="">Huntsman</brandName></td>
       <td><origin xmlns="">Bath, UK</origin></td>
       <td>
         <details xmlns=""><class>Bitter</class><hop>Fuggles</hop>
           <pro>Wonderful hop, light alcohol, good summer beer</pro>
           <con>Fragile; excessive variance pub to pub</con>
           </details>
          </td>
        </tr>
      </table>
    </Beers>

属性の一意性

この仕様に準拠するXML文書では、どのタグも次のいずれかの条件に該当する2つの属性を含むことができません。

  • 同一の名前を持つ2つの属性

  • 同じローカル部分を含み、同一の名前空間名にバインドされている接頭辞を含む修飾名を持つ2つの属性

たとえば、次の例では、各bad開始タグは許可されません。

<!-- http://www.w3.org is bound to n1 and n2 -->
  <x xmlns:n1="http://www.w3.org"
     xmlns:n2="http://www.w3.org" >
    <bad a="1"     a="2" />
    <bad n1:a="1"  n2:a="2" />
  </x>

ただし、デフォルトの名前空間は属性名に適用されないため、次の各good開始タグは有効です。

<!-- http://www.w3.org is bound to n1 and is the default -->
  <x xmlns:n1="http://www.w3.org"
     xmlns="http://www.w3.org" >
    <good a="1"     b="2" />
    <good a="1"     n1:a="2" />
  </x>

XML文書の準拠

W3CのNamespace勧告に準拠するXML文書では、要素型および属性名は、QNameに対する生成規則に適合し、名前空間制約を満たす必要があります。

XML文書内の、XML準拠のためにNameに対するXML生成規則に適合する必要がある他のすべてのトークンが、この仕様のNCNameに対する生成規則に適合する場合、そのXML文書はこの仕様に準拠します。

このような文書における準拠の効果は、次のとおりです。

  • すべての要素型および属性名には、0(ゼロ)または1つのコロンが含まれます。

  • エンティティ名、PIターゲットまたは表記法名のいずれにも、コロンは含まれません。

厳密には、ID、IDREF(S)、ENTITY(IES)およびNOTATION型と宣言された属性値は、Nameでもあるため、コロンを含まない値である必要があります。

ただし、属性値の宣言された型は、検証プロセッサなどの、マークアップ宣言を読み込むプロセッサのみで使用できます。そのため、検証プロセッサの使用が指定されないかぎり、属性値の内容がこの仕様に準拠しているかどうかが確認されるという保証はありません。

この手引きには、次に示すW3CのNamespace勧告の付録は含まれていません。

  • A. The Internal Structure of XML Namespaces (Non-Normative)(XML名前空間の内部構造(非規範的))

  • A.1 The Insufficiency of the Traditional Namespace(従来の名前空間の不十分さ)

  • A.2 XML Namespace Partitions(XML名前空間のパーティション)

  • A.3 Expanded Element Types and Attribute Names(拡張要素型および拡張属性名)

  • A.4 Unique Expanded Attribute Names(一意の拡張された属性名)

W3CのXML Information Setの概要

W3CのXML Information Set仕様は、XML Information Set(情報セット)という抽象データ・セットを定義します。この仕様は、整形式のXML文書内の情報を参照する必要がある他の仕様で使用するための一貫した一連の定義を示します。

情報項目またはプロパティを含める際の主な基準は、将来の仕様において有効であるかどうかです。この基準は、XMLプロセッサによって戻される必要がある最小限の情報セットを構成するものではありません。

XML文書は、整形式であり、次の項に示す名前空間制約を満たす場合、情報セットを持ちます。

情報セットを持つために、XML文書が妥当である必要はありません。

情報セットは、XML文書の解析以外の方法(この仕様では説明しません)によって作成できます。「総合情報セット」を参照してください。

XML文書の情報セットは、多くの情報項目で構成されます。どの整形式のXML文書の情報セットにも、1つ以上のドキュメント情報項目および他のものが含まれます。情報項目は、XML文書の一部の抽象的な記述です。各情報項目は、一連の関連付けられた名前付きのプロパティを持ちます。この仕様では、プロパティ名は大カッコで[このように]示します。情報項目のタイプについては、W3CのXML Information Setの第2項を参照してください。

XML Information Setは、特定のインタフェースやインタフェースのクラスを要求または優先しません。この仕様は明確化および単純化のために情報セットを変更されたツリーとして表しますが、XML Information Setをツリー構造で使用できるようにする必要はありません。イベントベースおよび問合せベースのインタフェースなどを含む、他の種類のインタフェースも、XML Information Setに準拠する情報を提供できます。

「情報セット」および「情報項目」という用語は、コンピュータ業界の一般的な用語である「ツリー」および「ノード」と類似する意味を持ちます。ただし、この仕様では、考えられる他の特定のデータ・モデルとの混同を避けるために、「情報セット」および「情報項目」という用語を使用します。情報項目は、DOMのノードまたはXPathデータ・モデルの「ツリー」および「ノード」とは1対1でマップされません。

この仕様では、「必要があります」および「場合があります」という言葉は、RFC2119に指定されている意味を持ちます。

名前空間およびW3CのXML Information Set

W3CのNamespace勧告に準拠しないXML 1.0文書は、技術的には整形式であっても、意味のある情報セットを持つとはみなされません。この仕様は、W3CのNamespace勧告で規定されている以外の方法で使用されるコロンを含む要素名または属性名を持つドキュメントに対する情報セットを定義しません。

また、XML Information Set仕様は、名前空間宣言で相対URI参照を使用するドキュメントに対する情報セットも定義しません。これは、W3CのNamespace勧告の「Relative Namespace URI References」(相対名前空間URI参照)に示されるW3C XML Plenary Interest Groupの決定に基づいています。

[namespace name]プロパティの値は、対応する名前空間属性の正規化された値です。プロセッサによって、この値に追加のURIエスケープが適用されることはありません。

エンティティ

情報セットは、実体参照がすでに拡張され、それらの置換テキストに対応する情報項目によって表現された状態で、そのXML文書を記述します。ただし、プロセッサがこの拡張を実行しない場合がある様々な環境が存在します。エンティティは、宣言または取出しされない場合があります。検証を行わないプロセッサは、一部の宣言を読み込まない場合や、すべての宣言を読み込む場合でも、一部の外部エンティティを拡張しない場合があります。このような場合、拡張されない実体参照情報項目が、その実体参照を表すために使用されます。

行端の処理

情報セットのすべてのプロパティの値は、XML勧告の第2.11項「End-of-Line Handling」(行端の処理)に示される行端の正規化を考慮したものです。

ベースURI

いくつかの情報項目は、[base URI]プロパティまたは[declaration base URI]プロパティを持ちます。これらのプロパティは、XML Baseに従って計算されます。リソースの取出しには、パーサー・レベル(エンティティ・リゾルバ内など)以下のレベルで、リダイレクションが含まれる場合があります。この場合、ベースURIは、すべてのリダイレクション後にリソースを取り出すために使用される最後のURIです。

これらのプロパティの値は、リソースを取り出すために必要な場合があるURIエスケープを反映しませんが、ドキュメント内で指定されるか、またはリダイレクションの場合にサーバーによって戻された場合、エスケープされた文字を含むことができます。

場合によっては(文字列またはパイプから読み込まれたドキュメントなど)、XML Baseの規則によって、アプリケーション依存のベースURIになる場合があります。これらの場合には、この仕様は、[base URI]プロパティまたは[declaration base URI]プロパティの値を定義しません。

相対URIの解決時には、xml:base属性の値よりも[base URI]プロパティを使用する必要があります。総合情報セットの場合、相対URIには一貫性がない場合があります。

UnknownおよびNo Value

一部のプロパティは、unknownまたはno valueという値を持つ場合があり、それぞれ「プロパティ値が不明」または「プロパティが値を持たない」ことを意味します。これらの2つの値は、異なる値であり、他のすべての値とも異なります。特にこれらの値は、それぞれ単にメンバーを持たない空の文字列、空のセットおよび空のリストとは異なります。NULLという用語は特別な意味を持つ場合があり、ここで意図する意味とは一致しない場合があるため、この仕様では使用しません。

総合情報セット

この仕様では、XML文書を解析した結果の情報セットについて説明します。情報セットは、DOMなどのApplication Program Interface(API)を使用する方法、既存の情報セットを変換する方法など、その他の方法でも構成できます。

実際のドキュメントに対応する情報セットは、様々な方法で一貫している必要があります。たとえば、要素の[in-scope namespaces]プロパティは、その要素およびその祖先の[namespace attributes]プロパティと一貫しています。これは、その他の方法で構成された情報セットには該当しない場合があります。このような場合、情報セットに対応するXML文書は存在せず、それをシリアル化するには、(有効範囲内の名前空間に対応する名前空間宣言の生成などによって)非一貫性を解決する必要があります。