2011-07-13 186 views
1

我正在嘗試編寫一個驗證以下xml代碼片段的xsd文檔。驗證xml元素的屬性值

<parentElement> 
    <someElement name="somethingRequired"/> 
    <someElement name="somethingElseRequired"/> 
    <someElement name="anything"/> 
</parentElement> 

它應驗證,如果parentElement包含someElement的至少兩個OCCURENCES其中一個具有包含值「somethingRequired」的屬性名稱和其他具有包含值「somethingElseRequired」的屬性名。

這可能嗎?

回答

2

這可能嗎?

這取決於您的限制需要具體如何。如果它足夠好,所有的name屬性具有唯一值,那麼你就可以<xs:unique>

<xs:schema elementFormDefault="qualified" xmlns:xs="http://www.w3.org/2001/XMLSchema"> 
    <xs:element name="parentElement"> 
    <xs:complexType> 
     <xs:sequence> 
     <xs:element minOccurs="2" maxOccurs="unbounded" name="someElement"> 
      <xs:complexType> 
      <xs:attribute name="name" type="xs:string" /> 
      </xs:complexType> 
     </xs:element> 
     </xs:sequence> 
    </xs:complexType> 
    <xs:unique name="uniqueName"> 
     <xs:selector xpath="someElement" /> 
     <xs:field xpath="@name" /> 
    </xs:unique> 
    </xs:element> 
</xs:schema> 

實現這一目標,您還可以限制例如屬性值的一些枚舉組所允許值,而不是僅僅使用type="xs:string"的。儘管僅限制前兩個名稱屬性是唯一的,因爲xpath屬性不允許包含謂詞,這是不可能的。

如果您需要第一個名稱屬性有一些具體的價值,第二個一些其他具體的價值,其餘的有任何價值,那麼我會說,這要麼違反架構組件約束Element Declarations Consistent或需要某種的共現約束條件比<xs:unique>更具體,所以一般情況下這是不可能的。您可能可以通過在實例文檔中使用xsi:type屬性來顯式聲明元素的類型。

0

除了基於屬性值進行驗證外,您想要執行的任何操作都是可能的。