2012-07-19 159 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