Versions Compared

Key

  • This line was added.
  • This line was removed.
  • Formatting was changed.

...

QUERY NODES(//Part[Price>2.99])
     NODESVALUE1(../../@SONumber)
     NODESVALUE2(@PartNumber)
     NODESVALUE3(Price)
     NODESVALUE4(../Quantity)
     NODESVALUE5(Price*../Quantity)


XML 名前空間と XMLQueryService の XPath 式への影響

これまで利用したサンプルは、名前空間の明示的な宣言が無く、名前空間の接頭辞も使用していない XML ドキュメントに対する演算でした。  これは最もシンプルな形ですが、多くの場合、これが現実を反映している訳ではありません。

...

 
ただし、ドキュメントで複数の名前空間の宣言が行われており、特に名前空間無しでは名前空間の競合が起こり得る場合は、名前空間認識モードでドキュメントをロードする必要があるかもしれません。  この名前空間認識モードのロードは、XMLQueryService の LOAD コマンドで NAMESPACEAWARE キーワードに *YES を設定すれば実行できます。  例:
LOAD FILE(salesorder.xml) NAMESPACEAWARE(*YES)
 
ただし、いったんドキュメントが名前空間認識モードでロードされると、ここまで上記で示したサンプル・クエリーは機能しなくなります。これは、名前空間が XML ドキュメント内のノード識別の一部を形成するからです。
名前空間認識モードで機能するように Xpath 式を作成する方法は様々ありますが、すべてのオプションを紹介することはこのドキュメントの目的ではありません。  ただし、以下の例は、まず始めに取り掛かる際に参考になると思います。

...

  1. この例では、XPath 組み込み関数 local-name を使って、lローカル名 (名前空間接頭辞が無いノード名) をベースにノードを選択します。
    QUERY NODES(//*\[local-name() = 'SalesOrder'\]) NODESVALUE1(@SONumber)

...

  1. 複数の名前空間が使用されており、このコンテキストで 'SalesOrder' が不明瞭な場合は、この前の例を拡張して、XPath 組み込み関数 namespace-uri を利用します。
    QUERY NODES(//*

...

  1. [local-name() = 'SalesOrder' and namespace-uri() = 'urn:schemas-acme-com:tutorder.dtd'

...

  1. ])
         NODESVALUE1(@SONumber)

...

  1. もしくは、XML ドキュメントのすべてのインスタンスで同じ名前空間の接頭辞が使用されていることが分かっている場合 (実際はこのようなケースが一般的ではありますが、そうでなければ有効にならない訳ではないことを頭に入れておいてください)、Xpath 式にこの名前空間の接頭辞を含めることができます (ドキュメントが名前空間認識モードでロードされていることが前提です)。
    QUERY NODES(//tut:SalesOrder) NODESVALUE1(@SONumber)


つまり、以下の各クエリは上に示されたドキュメントの名前空間の接頭辞バージョンで正しく作動します。これは、ドキュメントが名前空間認識モードでロードされており、かつ、実際の XML ドキュメントの名前空間接頭辞がクエリ内で指定されたものと一致していることが前提です。

...