使用Xpath选择在xsd中从基类扩展的所有节点

时间:2012-09-12 16:19:23

标签: xpath xsd

我的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?

1 个答案:

答案 0 :(得分:2)

可以在

中找到直接扩展baseClass的给定模式文档中声明的所有复杂类型的集合
//xs:complexType[xs:complexContent/xs:extension[@base='baseClass']]

如果您不仅需要childClass1childClass2等等,还需要扩展它们的所有类型(从而在一个或更多中扩展baseClass但是,您将不得不将一些逻辑从XPath转移到某些宿主语言并循环遍历元素。您想要做的事情可以用以下伪代码表示:

  1. 以空队列和空累加器开始。
  2. baseClass推入队列。
  3. 如果队列为空,则所需的类型集合位于累加器中。停止。
  4. (如果到达此步骤,则队列不为空。)从队列中删除第一个项目;让$x表示它的名字,如果它有一个,否则让$ x为空字符串。
  5. 找到集合//xs:complexType[xs:complexContent/xs:extension[@base=$x]]。将它们添加到队列和累加器中。
  6. 转到第3步。
  7. 请注意,我编写的XPath表达式将查找扩展给定命名库的所有复杂类型;如果您只想要命名的复杂类型,请将开头的//更改为/xs:schema/