2016-04-20 37 views
1

我有一個XSD 1.0序列,它定義了一組元素,其中一些元素可以是可選的,但其中沒有一個可以出現多次,並且還以<xsd:any minOccurs="0" maxOccurs="unbounded" namespace="##any" processContents="lax"/>標記結尾,以便用戶可以添加他們自己的數據元素以最簡單的方式編程導出符合的XML(即理想情況下不需要它們定義自己的名稱空間/ XSD)。對xsd進行進一步約束:any?

處理用戶生成的XML時,我會忽略通過<any>標記添加的任何自定義元素,但是我想知道是否有強制元素名稱唯一性的方法,以便我可以確定它們'是不是將maxOccurs=1中定義的元素的重複項放在一起?

下面是一個簡單的XSD(交互式版本here):

<?xml version="1.0" encoding="utf-8"?> 
<xsd:schema xmlns="testxsd" targetNamespace="testxsd" 
      xmlns:xsd="http://www.w3.org/2001/XMLSchema" 
      elementFormDefault="qualified"> 
    <xsd:element name="XSDSequence"> 
     <xsd:complexType> 
      <xsd:sequence> 
       <xsd:element name="itemA" type="xsd:string" 
          minOccurs="1" maxOccurs="1"/> 
       <xsd:element name="itemB" type="xsd:string" 
          minOccurs="0" maxOccurs="1"/> 
       <xsd:element name="itemC" type="xsd:string" 
          minOccurs="1" maxOccurs="1"/> 
       <xsd:any minOccurs="0" maxOccurs="unbounded" 
         namespace="##any" processContents="lax"/> 
      </xsd:sequence> 
     </xsd:complexType> 
    </xsd:element> 
</xsd:schema> 

這裏是傳遞XSD驗證,但我想對因錯誤出在最後的複製<itemA>一個示例XML:

<XSDSequence xmlns="testxsd" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> 
    <itemA>foo</itemA> 
    <itemC>bar</itemC> 
    <randomElement>this is ok</randomElement> 
    <itemA>I want this second itemA to cause an error</itemA> 
</XSDSequence> 

(請注意,通過屬性而不是元素捕獲數據項是東西,我婉噸至做。)

回答

1

不,XSD 1.0,一旦你允許任何元素,你不能指定超出那些minOccursmaxOccursnamespaceprocessContents提供進一步的約束。

在XSD 1.1中,您還可以針對xsd:any元素製作xsd:assertions;你可以用斷言來表達你的約束。 [更新:不要錯過@C. M. Sperberg-McQueen's simpler idea的XSD 1.1:xsd:any/@notQName="itemA itemB itemC"]

+0

謝謝,我認爲這很可能是這種情況。 – ivanatpr

2

也許最簡單的方法,以確保itemAitemB,並且itemC不重複的元素是使用namespace="##other"而不是namespace="##any"。 (這裏假定名稱空間testxsd中的元素不需要在這裏出現。)

或者移動到XSD 1.1並添加屬性notQName="itemA itemB itemC"

+0

確實,它在XSD 1.1中看起來像notQName =「## definedSibling」正是我想要的。在與各種消費者打交道時,支持XSD 1.1是一個非起步者,這是一個恥辱。使用XML/XSD作爲數據傳輸格式的關鍵在於它幾乎得到了普遍支持,並且XSD 1.1支持已經以蝸牛的速度起飛。 – ivanatpr