我试图选择序列中所有子元素,其实现类型的元素名称是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>
和“TruckEngine”看起来像:
<xs:complexType name="TruckEngine">
...
</xs:complexType>
如何创建XPATH以选择元素DriverName?到目前为止,我有类似xs:complexType / xs:complexContent / xs:extension / xs:sequence / xs:element,但我不知道如何进一步提高我的选择。我一直很难搜索相关信息,因为我不确定用什么术语来选择这样的东西。我已将我的示例修改为更通用的内容。
答案 0 :(得分:3)
尝试从架构文档中提取信息很困难(几乎不可能),除非您了解架构作者使用的约定。例如,DevNull(您接受)的解决方案仅在类型在同一模式文档中定义时才起作用,它只适用于命名(非匿名)类型,并且只适用于没有targetNamespace的模式文档。
对于更通用的解决方案,无论编写规则如何都适用于任何模式,请不要尝试这样做:使用模式API,通过模式处理器分析后,可以访问“cooked”模式组件。一种方法是使用Xerces为模式组件提供Java API,另一种方法是使用Saxon的SCM格式,它在单个文档中提供“熟”模式组件的XML表示。
答案 1 :(得分:2)
您可以使用:
//xs:element[@type = //xs:simpleType/@name]
虽然我建议使用更明确的路径,而不是使用//
。
(修改:将eq
更改为=
)