2010-01-15 79 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>