2016-06-13 81 views
0

我一直對此感到震驚,因爲我已經有一段時間沒有接近答案了。XSD complexType - 將cdata限制爲僅限某些字符和2個子元素

我試圖創建一個XML Schema文件,以允許更精確的驗證AIML文件,基於AIML 1.0.1 specification,並且我遇到了一個障礙。根據本說明書中,<pattern>和(輸入側)<that>標籤可以只允許幾個子元素(<bot>和/或<eval>) - 或 - CDATA只能包括:

  • 字母數字字符(az,AZ,或0-9)
  • 空間
  • 一個(或兩個)的兩個 '通配符' 字符(*或_)有效和無效0的

實例個標籤可能是這樣的:

<!-- valid PATTERN --> 
<pattern>HELLO</pattern> 
<pattern>HELLO *</pattern> 
<pattern>_ IS FOR SALE</pattern> 

<!-- invalid PATTERN --> 
<pattern>HOW ARE YOU TODAY?</pattern> <!-- note the question mark --> 
<pattern>50%</pattern> <!-- note the percent sign --> 

順便說一句,在XSD爲<pattern>標籤的當前狀態是低於,並努力將CDATA限制字符所需的列表:

<xs:element name="pattern"> 
    <xs:complexType mixed="true"> 
    <xs:simpleContent> 
     <xs:extension base="aiml:InputPatternType"> 
     </xs:extension> 
    </xs:simpleContent> 
    </xs:complexType> 
</xs:element> 

<xs:simpleType name="InputPatternType"> 
    <xs:restriction base="xs:string"> 
    <xs:pattern value="[\w| |_|\*]*"/> 
    </xs:restriction> 
</xs:simpleType> 

然而,這不允許使用必要的子元素,爲其代碼是在這裏:

<xs:choice minOccurs="0" maxOccurs="unbounded"> 
    <xs:element ref="aiml:bot"/> 
    <xs:element ref="aiml:eval"/> 
</xs:choice> 

當我嘗試將這一雙t根據我試圖添加此代碼的方式,從「意外的子元素」到關於「如果<complexType>替代選擇......」等投訴,我會得到各種錯誤。我讀過幾篇文章(最有幫助的是this one,但正如我剛纔提到的那樣,上週我沒有比我剛開始時更接近解決這個問題。我知道我只是想念一些簡單的東西,但我看不到它,所以許多與此相關的SO文章都沒有收到任何有用的結果,因爲它們大多隻涉及子元素,而不涉及如何將CDATA限制爲某些字符。

我很清楚的,上面的代碼使用simpleTypesimpleContent代替complexTypecomplexContent,但我使用這些努力都沒有遇到任何成功的事實,所以我貼的是目前(部分)工作。任何與此有關的幫助將被虛心讚賞。謝謝。

回答

1

您描述的設計無法在不損失XSD內容模型的情況下進行翻譯:要使用模式構面來限制合法字符集,您的元素必須具有簡單內容(即簡單類型或具有簡單內容的複雜類型 - - 複雜的,那麼,只有它可以攜帶屬性);爲了允許子元素bot和eval,元素必須具有複雜的內容。

在你的選擇:

  1. 宣告以混合內容的複雜類型,它允許機器人和eval,並使用XSD 1.1斷言約束在字符內容中找到的字符。

  2. 定義的XML表示這是不完全你的描述,但它可以精確地驗證和其中1映射:1至你的描述:不是定義單個pattern元件,聲明兩個命名input-patternbot-eval-pattern(或隨你喜歡)。將輸入模式定義爲具有InputPatternType,而bot-eval-pattern具有複雜類型,可選擇aiml:bot和aiml:eval。

    如果您願意,您可以定義一個名爲pattern的抽象元素,並將其命名爲兩個具體元素input-pattern和bot-eval-pattern的替換組頭;這允許其他名稱爲pattern的內容模型僅提及pattern而不是提及兩個具體類型。

+0

感謝您的回答。我贊成它,因爲它給了我一個研究的方向,但因爲它實際上並沒有幫助解決問題,所以我不能接受它作爲答案。儘管如此,我仍然在努力,所以我很有希望。 –

+0

我應該在我的評論中加入解釋。抱歉。可悲的是,選項2對於這個項目不可行,因爲我在一個已經存在的規範中工作,只允許一個''元素,而沒有別的。選項1可能是可能的,但它超出了我目前的經驗,所以在我嘗試實施它之前,我必須學習更多。 –