2010-01-15 51 views
5

存在子元素是否有可能在XSD定義以下情形:XML模式 - 依賴於可選屬性

  1. 父元素具有

    是可選的屬性。

  2. 如果屬性不

    present in XML, at least one child 
    
    element must exists. 
    
  3. 如果

    attribute is present, there can be 
    
    zero or more child elements. 
    

實施例:

VALID

<parent externel-source="some_name" /> 



<parent externel-source="some_name"> 

    <child>some value</child> 

</parent> 



<parent> 

    <child> some value</child> 

</parent> 

無效

<parent /> 

回答

-1

不,我不這麼認爲。

+0

答案不適合我滿意的。你的陳述背後的推理是什麼? – 2010-01-15 11:00:45

+2

XML模式類型與您的OO編程類型非常相似。您可以創建複雜類型,並且可以限制元素和屬性的元素類型的順序以及可以分配哪種類型的值的限制。這就是所有的xsd可以爲你做的。你想要的是一些限制,跨越多個元素/屬性,這是xsd根本無法實現的。你必須編寫自己的代碼來驗證這一點。 – affan 2010-01-15 14:51:52

+0

我也認爲這是不可能的,而且這是一個非常好的答案(如果它是正確的):-) – 2010-01-15 15:21:16

3

不..原因是:在你的情況下,你正試圖驗證元素/標籤的存在取決於其他標籤/屬性的值..(XSD基本上是一組聲明),它需要多個..
同一元素的多個聲明不XSD允許同一元素的聲明.. :-(
退房發表一個計算器成員similar problem (click here)

0

對不起復活這個消息,但我認爲我可以在事情的「原因」上添加一些內容,W3C XML Schema要求它的所有序列都是完全確定的,出於性能/簡單的原因,它並不是設計爲向前看或向後看,只能起作用在當前元素上。我也相信這是從SGML繼承而來的。

你想要做什麼需要這樣的功能。你可能想看看Schematron;它支持你想要的。

0

是的,絕對可以,使用xsi:type(這可能不是你想要的!)。 例如下面的xsd;

<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified" attributeFormDefault="unqualified" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> 
<xs:element name="data"> 
    <xs:complexType> 
     <xs:choice> 
      <xs:element ref="elemParent" minOccurs="1" maxOccurs="unbounded"/> 
     </xs:choice> 
    </xs:complexType> 
</xs:element> 
<xs:element name="elemParent" type="ctBase"></xs:element> 
<xs:complexType name="ctNoAttChildReq"> 
    <xs:complexContent> 
     <xs:extension base="ctBase"> 
      <xs:sequence> 
       <xs:element name="elemKid" type="xs:string"></xs:element> 
       <xs:element name="elemKidAdditional" type="xs:string" minOccurs="0"></xs:element> 
      </xs:sequence>    
     </xs:extension> 
    </xs:complexContent>  
</xs:complexType> 
<xs:complexType name="ctAttNoChild"> 
    <xs:complexContent> 
     <xs:extension base="ctBase"> 
      <xs:attribute name="attReq" use="required"/> 
     </xs:extension> 
    </xs:complexContent>   
</xs:complexType>  
<xs:complexType name="ctBase" abstract="true"> 
    <xs:sequence/> 
</xs:complexType>  

你有任何一個屬性或一個或更多的孩子一個實例,但你必須有XSI:類型的實例,它可能會或可能不會是一個表明,塞。這種類型的

<data xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="file:///C:/Xsds/StackOverflow_2070316_WIP.xsd"> 
<elemParent attReq="Yo!" xsi:type="ctAttNoChild"/> 
<elemParent xsi:type="ctNoAttChildReq"> 
    <elemKid>Adam</elemKid> 
</elemParent> 
<elemParent xsi:type="ctNoAttChildReq"> 
    <elemKid>Eve</elemKid> 
    <elemKidAdditional>Sid</elemKidAdditional> 
</elemParent>