XPATH选择类型的元素名称为xs:simpleType的子元素

时间:2012-07-19 21:10:41

标签: xslt xpath

我试图选择序列中所有子元素,其实现类型的元素名称是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,但我不知道如何进一步提高我的选择。我一直很难搜索相关信息,因为我不确定用什么术语来选择这样的东西。我已将我的示例修改为更通用的内容。

2 个答案:

答案 0 :(得分:3)

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

对于更通用的解决方案,无论编写规则如何都适用于任何模式,请不要尝试这样做:使用模式API,通过模式处理器分析后,可以访问“cooked”模式组件。一种方法是使用Xerces为模式组件提供Java API,另一种方法是使用Saxon的SCM格式,它在单个文档中提供“熟”模式组件的XML表示。

答案 1 :(得分:2)

您可以使用:

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

虽然我建议使用更明确的路径,而不是使用//

(修改:将eq更改为=