【问题标题】:Use Xpath to select all nodes that extend from base class in xsd使用 Xpath 选择从 xsd 中的基类扩展的所有节点
【发布时间】:2012-09-12 16:19:22
【问题描述】:

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

【问题讨论】:

    标签: xpath xsd


    【解决方案1】:

    在给定模式文档中声明的所有复杂类型的集合直接扩展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 步。

    请注意,我编写的 XPath 表达式会发现所有扩展给定命名基的复杂类型;如果您只想命名复杂类型,请将开头的// 更改为/xs:schema/

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-06-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-01-15
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多