XPathコマンドの使用
XPathは、World Wide Web Consortium(W3C)によって開発された業界標準です。
これはXMLドキュメントのナビゲーションに使用される方法です。XPathはXMLドキュメントの個々の部分を処理するための一連の構文規則です。RTFテンプレートでは、実行時に、XMLデータのナビゲーションにXPathが使用されるため、ユーザーは認識していなくても、すでにXPathを使用しています。
この項では、XPathの原理の概要について説明します。XPathは、XML文書をノードのツリーとして解釈するDocument Object Model(DOM)に従っています。ノードは、次の7タイプのいずれかです。
-
root
-
要素
-
attribute
-
text
-
ネームスペース
-
処理命令
-
コメント
これらの要素の多くが次のサンプルXMLに示されています。このサンプルにはCDのカタログが含まれています。
<?xml version="1.0" encoding="UTF-8"?>
<! - My CD Listing - >
<CATALOG>
<CD cattype=Folk>
<TITLE>Empire Burlesque</TITLE>
<ARTIST>Bob Dylan</ARTIST>
<COUNTRY>USA</COUNTRY>
<PRICE>10.90</PRICE>
<YEAR>1985</YEAR>
</CD>
<CD cattype=Rock>
<TITLE>Hide Your Heart</TITLE>
<ARTIST>Bonnie Tylor</ARTIST>
<COUNTRY>UK</COUNTRY>
<PRICE>9.90</PRICE>
<YEAR>1988</YEAR>
</CD>
</CATALOG>
この例のルート・ノードはCATALOGです。CDは要素であり、属性cattypeが設定されています。サンプルには、コメントとしてMy CD Listingと記述されています。テキストはXML文書要素内に含まれています。
データの検索
location-path式を使用して、XML文書内の情報を検索します。
ノードはユーザーが使用する最も一般的な検索要素です。サンプルのCATALOG XMLのノードには、CD、TITLEおよびARTISTなどがあります。XML文書内のノードを検索するには、パス式を使用します。たとえば、次のパスではすべてのCD要素が戻されます。
//CATALOG/CD
説明
ダブル・スラッシュ(//)は、文書内のレベルに関係なく、XML文書内で検索基準と一致する要素がすべて戻されることを示します。
スラッシュ(/)は子ノードを区切ります。パターンと一致するすべての要素が戻されます。
個々のTITLE要素を取得するには、次のコマンドを使用します。
/CATALOG/CD/TITLE
この例では、次のXMLが戻されます。
<CATALOG>
<CD cattype=Folk>
<TITLE>Empire Burlesque</TITLE>
</CD>
<CD cattype=Rock>
<TITLE>Hide Your Heart</TITLE>
</CD>
</CATALOG>
検索内容をさらに制限するには、大カッコを使用します。大カッコを使用すると、特定の子ノードまたは指定した値を含んだ要素が検索されます。たとえば、次の式では、Bob DylanのすべてのCDが検索されます。
/CATALOG/CD[ARTIST="Bob Dylan"]
または、各CD要素にPRICE要素が設定されていない場合は、次の式を使用してPRICE要素が含まれているCD要素のみを戻すことができます。
/CATALOG/CD[PRICE]
大カッコを使用する表記法では、検索に属性値を利用できます。属性を示すには@記号を使用します。たとえば、次の式では、ロックのすべてのCD(cattype属性の値がRockのすべてのCD)が検索されます。
//CD[@cattype="Rock"]
この結果、サンプルXML文書から次のデータが戻されます。
<CD cattype=Rock>
<TITLE>Hide Your Heart</TITLE>
<ARTIST>Bonnie Tylor</ARTIST>
<COUNTRY>UK</COUNTRY>
<PRICE>9.90</PRICE>
<YEAR>1988</YEAR>
</CD>
また、大カッコを使用して、取得する項目の番号を指定することもできます。たとえば、次のXPath式を使用すると、XML文書から最初のCD要素が読み込まれます。
/CATALOG/CD[1]
次のように、サンプルから最初のCD要素が戻されます。
<CD cattype=Folk>
<TITLE>Empire Burlesque</TITLE>
<ARTIST>Bob Dylan</ARTIST>
<COUNTRY>USA</COUNTRY>
<PRICE>10.90</PRICE>
<YEAR>1985</YEAR>
</CD>
XPathでは、指定したノード内に含まれているすべての要素を取得するためのワイルドカードもサポートされています。たとえば、サンプルXMLからすべてのCDを取得するには、次の式を使用します。
/CATALOG/*
さらに複雑な検索のために、文とブール演算子を組み合せることができます。次の式では、すべてのフォークおよびロックのCDが取得され、結果としてサンプルからすべての要素が取得されます。
//CD[@cattype="Folk"]|//CD[@cattype="Rock"]
縦線(|)は、論理OR演算子と同等です。さらに、XPathでは、ORおよびANDに加え、等価演算子<=、<、>、>=、==および!=が認識されます。たとえば、次の式を使用すると、1985年以降にリリースされたすべてのCDを検索できます。
/CATALOG/CD[YEAR >=1985]
参照の開始
XPath式の最初の文字で、XMLツリー内の開始位置が決まります。
スラッシュ(/)で始まる文は絶対参照とみなされます。スラッシュが指定されない場合は相対参照を意味します。相対参照の例を次に示します。
CD/*
この文では、現行の参照ポイントで検索が開始されます。つまり、この例が1つの文グループ内で使用されている場合は、その前の文で使用された参照ポイントが使用されます。
すでに述べたように、2本のスラッシュ(//)により、ドキュメント内の位置にかかわらず、すべての一致する要素が取得されます。このため、パフォーマンスを改善するのに必要な場合のみ、2本のスラッシュ(//)を使用する必要があります。
コンテキストおよび親の指定
現行要素と親要素を選択するために、XPathでは、ディレクトリのナビゲートに通常使用されているドット表記法が認識されます。
ピリオドを1つ(.)使用すると現行ノードが選択され、ピリオドを2つ(..)使用すると、現行ノードの親が戻されます。たとえば、現行ノードの親の子ノードをすべて取得するには、次の式を使用します。
../*
したがって、サンプルXMLからすべてのCDにアクセスするには、次の式を使用します。
/CATALOG/CD/..
また、次の式を使用して、1988年にリリースされたすべてのCDのタイトルにアクセスすることもできます。
/CATALOG/CD/TITLE[../YEAR=1988]
2つのピリオド(..)を使用すると、要素ツリーを上に移動してTITLEと同じレベルでYEAR要素が検索され、そのYEAR要素で1988との一致が評価されます。この例では//も使用できますが、要素YEARがXML文書の他の場所でも使用されている場合は、誤った結果が戻される可能性があります。
XPathは、RTFテンプレートと組み合せると非常に強力な標準になり、テンプレートで条件付き書式設定およびフィルタリングを使用できます。