2012-05-15 40 views
1

也許我一直在盯着這個問題太久,也許沒有答案;無論哪種方式,我現在在這裏。模式中的內容模型歧義

我想在XSD中允許一組可能的組合,但我似乎無法找到一種不會導致含糊不清的方法。

快速regexy respresentation:

foo+ (bar baz* | bar? baz+ qux*) 
  • foo需要(一個或更多的
  • 如果bar存在,baz是可選的(零或更多的
  • 如果baz存在,bar是可選的(零或一)和qux是可選的(零或更多的)如果baz不存在

歧義發生給定foo bar baz

  • qux不可能存在。

    曖昧XSD文件:好措施

    <xs:element name="parent"> 
        <xs:complexType> 
         <xs:sequence> 
          <xs:element name="foo" minOccurs="1" maxOccurs="unbounded" /> 
          <xs:choice> 
           <xs:sequence> 
            <xs:element name="bar" minOccurs="1" maxOccurs="1" /> 
            <xs:element name="baz" minOccurs="0" maxOccurs="unbounded" /> 
           </xs:sequence> 
           <xs:sequence> 
            <xs:element name="bar" minOccurs="0" maxOccurs="1" /> 
            <xs:element name="baz" minOccurs="1" maxOccurs="unbounded" /> 
            <xs:element name="qux" minOccurs="0" maxOccurs="unbounded" /> 
           </xs:sequence> 
          </xs:choice> 
         </xs:sequence> 
        </xs:complexType> 
    </xs:element> 
    

    截屏:

    Ambiguous XSD tree


    現在,我開始意識到也許這僅僅是XSD內容模型的約束。歧義的原因是顯而易見的;解決方案並非如此。

    任何人都可以看到我可以允許這種方式;通過重新排序元素,通過使用一些模式設計模式來減輕這種模糊情景?

    barbaz的條件相關性顯然是問題,但我想不出有任何其他方式來做到這一點。

    非常感謝人們。


    編輯:目前在讀,試圖找到一個循環洞「Schema Component Constraint: Unique Particle Attribution」。任何其他建議閱讀歡迎。

  • 回答

    3

    IIRC在計算機科學中有一個定理,說每一個模棱兩可的語法都可以被重寫爲一個明確的語法,所以從假設它是可能的開始。但是,明確的語法有時可能會非常複雜。

    我認爲處理這個問題的好方法是繪製語法的「鐵路圖」,即有限狀態機及其轉換。然後當你在這臺機器上發現一個狀態,它有兩個標有相同符號的轉換時,你需要構造一個接受這兩個轉換的新狀態,依此類推。在CS文獻中,這種算法被稱爲「確定性」。

    這也許是不容易白板解釋另一種方法是通過分解出什麼是您所選擇的兩個分支之間的共同啓動。當你點擊內容中的第一個元素時,它必須是酒吧或baz。所以寫下兩個選擇,一個是以bar開始,另一個是以baz開始。

    據我所看到的,你的內容模型是euiqvalent到明確的模型

    (bar, (baz+, qux*)?) | (baz+, qux*) 
    

    ,但我會仔細檢查...

    +0

    謝謝@MichaelKay,您建議的表達完美地工作! (*也許我的分析技能在我昨晚做過之前已經上牀睡覺了*)我相信我會對消除歧義策略進行一些評論,強行回憶一下XSD中的合成器可以擁有基數的事實。 – Dan