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>

有没有办法使用 xpath 来选择 childClass1、childClass2 以及从 baseClass 扩展的所有类型,而无需单独选择所有 childClass?

4

1 回答 1

2

在给定模式文档中声明的直接扩展的所有复杂类型的集合baseClass可以通过

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

但是,如果您不仅需要childClass1等等childClass2,还需要扩展它们的所有类型(并因此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 回答