2

異なる名前空間を持つ 2 つの xml ドキュメントがあります。

declare namespace ml1 = "urn:schemas-com:ml1";
declare namespace ml2 = "urn:schemas-com:ml2";

でも同じ構造。* を使用せずに、これらの名前空間のみを使用していくつかのノードを選択できますか? 私はそのようなことを意味します:

fn:doc($uri)/(ml1 or ml2):root

更新: ありがとう。すべての提案は機能しますが、私にとっては役に立ちません。3 つ以上の名前空間が存在する可能性があり、xpath 式が非常に大きくなるためです。助言がありますか?

結論: 回答ありがとうございます。すべての xml すべてのドキュメントを処理する必要があるという @MichaelKay に同意します。問題は解決しました。

4

4 に答える 4

3

1 つの可能な表現は次のとおりです。

  doc($uri)/(ml1:root|ml2:root)

もう一つは

  doc($uri)/*[self::ml1:root or self::ml2:root]

形式の接頭辞が無制限に存在する可能性がある場合は、次"mlNNNNN""を使用します。

  doc($uri)/*[matches(substring-before(name(), ':'), '^ml\d+')]
于 2012-08-07T13:10:16.963 に答える
3

述語を使用できます

fn:doc($uri)/*[local-name() = "root" and (namespace-uri() = "urn:schemas-com:ml1" or namespace-uri() = "urn:schemas-com:ml2")]

名前空間URIにすべて共通のプレフィックスがある場合(提供した例が示唆しているように)、次のような構造を使用できます

..../*[starts-with(namespace-uri(), "urn:schemas-com:") ...]

多数の名前空間があり、それらすべてを別の XML ファイルにリストできる場合:

<namespaces>
  <uri>urn:schemas-com:ml1</uri>
  <uri>urn:schemas-com:ml2</uri>
  <!-- ... -->
</namespaces>

そして述語

*[namespace-uri() = fn:doc("namespaces.xml")/namespaces/uri]

テスト対象のノードの名前空間 URI が にリストされている名前空間のいずれかnamespaces.xmlと一致する場合は true になります。

于 2012-08-07T13:12:15.423 に答える
2
let $qnames :=
  for $ns in ("urn:schemas-com:ml1", "urn:schemas-com:ml2")
  return QName($ns, 'root')
return doc($uri)/*[node-name(.) = $qnames]

node-nameルックアップではインデックスを使用する必要があります。

または、文字列操作を使用してパスを作成し、呼び出しxdmp:unpathて評価することもできます: http://docs.marklogic.com/5.0doc/docapp.xqy#display.xqy?fname=http://pubs/5.0doc/ apidoc/ExsltBuiltins.xml&category=Extension&function=xdmp:unpath

于 2012-08-07T14:35:26.803 に答える
2

この問題が発生した場合の最善の解決策は、まず名前空間を正規化することです。つまり、すべてのドキュメントが共通の形式になるように変換を行ってから、正規化された形式に XPath 式を適用します。

于 2012-08-07T15:00:12.493 に答える