2012-07-19 130 views
3

我试图选择序列中实现类型的元素名称为xs:simpleType的所有子元素。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

你可以使用:

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

虽然我推荐一个更明确的路径,而不是使用//的。

(编辑:改变eq=

+0

我还不能回答我自己的问题,但你把我们推向了正确的方向。我修改它为:xs:element [contains(@type,// xs:simpleType/@ name)] – kurtzbot 2012-07-19 23:04:15

+0

我忘记说了,使用contains的原因是因为// xs:simpleType捕获所有simpleTypes文件的根源,因此无法直接进行比较。包含通过匹配元素列表搜索,然后将它们的名称与我们元素的类型进行比较。 – kurtzbot 2012-07-19 23:15:17

+0

@kurtzbot - 你试过'='而不是'eq'吗? (我编了一个以上的'xs:simpleType')很高兴你的工作虽然。 – 2012-07-19 23:36:14

3

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

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

+0

非常好的点和替代品。 +1 – 2012-07-20 14:50:12