2016-02-25 37 views
1

是否可以爲遞歸的,未知名稱的元素定義一個XML模式? 例如:如何爲遞歸和未知名元素定義XML模式?

<Bob age="72"> 
    <FavoriteColor>"Blue"</FavoriteColor> 
    <Children> 
     <Sally age="36"> 
      <FavoriteColor>"Green"</FavoriteColor> 
      <Children /> 
     </Sally> 
     <Joe age="34"> 
      <FavoriteColor>"Red"</FavoriteColor> 
      <Children> 
       <Tina age="5"> 
        <FavoriteColor>"Blue"</FavoriteColor> 
        <Children /> 
       </Tina> 
       <Frank age="6"> 
        <FavoriteColor>"Yellow"</FavoriteColor> 
        <Children /> 
       </Frank> 
      </Children> 
     </Joe> 
    </Children> 
</Bob> 

我是相當新的XSD,但我認爲這需要遞歸和<xs:any>的某種組合。

參見: Recursion in an XML schema?how can I define an xsd file that allows unknown (wildcard) elements?

但是我找不到不涉及重寫我的暗示Person元素與更嚴格的形式的解決方案:

<Person name="Bob" age="72"> 
    <FavoriteColor /> 
    <Children /> 

是原始的XML Schema -能夠?

回答

2

您已正確識別xsd:any作爲允許Children下的任何元素的解決方案,並且您已正確識別表示類似家庭樹狀結構的遞歸類型模式。

但是,xsd:any不符合它所管理的元素的部分約束任務。一旦你使用xsd:any,你將失去對該點下方標記的控制。它唯一的選擇是關於有效性如何受遇到因素定義的影響;見processContents strict vs lax vs skip for xsd:any

試圖讓第一個例子的工作將是一場艱苦的戰鬥。 (你可以在XSD 1.1中使用斷言,但是你會不自然地強迫斷言來完成通過簡單的內容模型完成的任務。這是更好的XML設計。

+2

通用形式還具有允許''你根本不想限制人們根據NCNames的規則命名他們的孩子。 –

+0

沒有提到這種優勢,因爲我認爲只要解析器作者的工作更容易,Mary-Ann,Mary_Ann或MaryAnn的父母就不會介意。 :-) – kjhughes