1

私のxsdファイルは次のようなものです:

<xs:complexType name="baseClass">
</xs:complexType>

<xs:complexType name="childClass1">
<xs:complexContent>
<xs:extension base="baseClass">
</xs:extension>
</xs:complexContent>
</xs:complexType>

<xs:complexType name="childClass2">
<xs:complexContent>
<xs:extension base="baseClass">
</xs:extension>
</xs:complexContent>
</xs:complexType>

すべてのchildClassを個別に選択せずに、xpathを使用してchildClass1、childClass2、およびbaseClassから拡張するすべての型を選択する方法はありますか?

4

1 に答える 1

2

特定のスキーマドキュメントbaseClassで宣言され、直接拡張されるすべての複合型のセットは、次のように見つけることができます。

//xs:complexType[xs:complexContent/xs:extension[@base='baseClass']]

childClass1ただし、などだけでなくchildClass2、それらを拡張する(したがって、1つ以上のステップで拡張する)すべてのタイプがbaseClass必要場合は、ロジックの一部をXPathからホスト言語に移動してループする必要があります。要素の上。やりたいことは、次の擬似コードで表すことができます。

  1. 空のキューと空のアキュムレータから始めます。
  2. baseClassキューにプッシュします。
  3. キューが空の場合、必要なタイプのセットはアキュムレータにあります。止まる。
  4. (このステップに到達した場合、キューは空ではありません。)キューから最初のアイテムを削除します。$x名前がある場合はその名前を示し、そうでない場合は$xを空の文字列とします。
  5. セットを見つけます//xs:complexType[xs:complexContent/xs:extension[@base=$x]]。それらをキューとアキュムレータの両方に追加します。
  6. 手順3に進みます。

私が書いたXPath式は、指定された名前付きベースを拡張するすべての複合型を見つけることに注意してください。名前付きの複合型のみが必要な場合は//、先頭のをに変更し/xs:schema/ます。

于 2012-09-13T00:32:42.350 に答える