3

我正在尝试选择序列中实现类型的元素名称为 xs:simpleType 的所有子元素。

<xs:complexType name="Truck">
    <xs:complexContent>
        <xs:extension base="Car">
            <xs:sequence>
                <xs:element name="DriverName" type="Name">
                    ...
                </xs:element>
                <xs:element name="Engine" type="TruckEngine">
                    ...                   
                </xs:element>
            </xs:sequence>
        </xs:extension>
    </xs:complexContent>
</xs:complexType>

“名称”类型如下所示:

<xs:simpleType name="Name">
    ...
</xs:simpleType>

“卡车引擎”看起来像:

<xs:complexType name="TruckEngine">
    ... 
</xs:complexType>

如何创建 XPATH 来选择元素 DriverName?到目前为止,我有类似 xs:complexType/xs:complexContent/xs:extension/xs:sequence/xs:element 的东西,但我不知道如何进一步改进我的选择。我很难搜索相关信息,因为我不确定使用什么术语来选择这样的东西。我已将示例修改为更通用的内容。

4

2 回答 2

3

除非您知道架构作者使用的约定,否则尝试从架构文档中提取信息是困难的(几乎是不可能的)。例如,来自 DevNull 的解决方案(您已接受)仅适用于在同一模式文档中定义的类型,它仅适用于命名(非匿名)类型,并且仅适用于没有 targetNamespace 的模式文档.

对于更通用的解决方案,无论创作约定如何,它都适用于任何模式,不要尝试这样做:使用模式 API,它允许您在模式处理器分析后访问“熟”的模式组件。一种方法是使用为模式组件提供 Java API 的 Xerces,另一种方法是使用 Saxon 的 SCM 格式,该格式在单个文档中提供“已处理”模式组件的 XML 表示。

于 2012-07-20T08:23:48.317 回答
2

你可以使用:

//xs:element[@type = //xs:simpleType/@name]

尽管我建议使用更明确的路径而不是使用//.

(编辑:更改eq=

于 2012-07-19T22:37:17.070 回答