2010-03-22 28 views
5

Tengo un esquema XML (XSD) que define un elemento como obligatorio (llámalo padre); este padre tiene, digamos, cinco elementos secundarios, que pueden ser opcionales, PERO POR LO MENOS debe haber un elemento secundario.Esquema XML (XSD): cómo especificar que el elemento primario contenga al menos un elemento secundario?

¿Cómo puedo especificar esto en el xsd?

Para aclarar: Los niños son elementos diferentes y opcionales. Por ejemplo.

<Parent> 
    <Child1>contents are different to other siblings and arbitrary</Child1> 
    <Child2>can be text, a simple element, or another complex element</Child2> 
    <Child3>etc.. etc</Child3> 
</Parent> 

<xs:complexType name="Parent"> 
    <xs:sequence> 
    <xs:element minOccurs="0" name="Child1" type="xs:string"/> 
    <xs:element minOccurs="0" name="Child2" /> 
    <xs:element minOccurs="0" name="Child3" /> 
    </xs:sequence> 
</xs:complexType> 

A pesar de que cada niño es opcional, el padre tiene que tener al menos un hijo.

+0

Después de revisar las respuestas (y mucha Google), parece que no hay una construcción fácil en xsd para especificar esto; Más problemas de los que vale, he optado por permitir que el software de validación aplique reglas adicionales (como por ejemplo, debe haber al menos un hijo). – joedotnot

Respuesta

4

Siempre existe el enfoque directo:

<xs:complexType name="Parent"> 
    <xs:choice> 
    <xs:sequence> 
     <xs:element name="Child1"/> 
     <xs:element name="Child2" minOccurs="0"/> 
     <xs:element name="Child3" minOccurs="0"/> 
    </xs:sequence> 
    <xs:sequence> 
     <xs:element name="Child2"/> 
     <xs:element name="Child3" minOccurs="0"/> 
    </xs:sequence> 
    <xs:sequence> 
     <xs:element name="Child3"/> 
    </xs:sequence> 
    </xs:choice> 
</xs:complexType> 
+2

El enfoque directo probablemente funcionaría; pero se vuelve demasiado engorroso para muchos elementos secundarios. – joedotnot

+0

JAXB está generando un mal resultado cuando lo transforma en clase Java –

0

Use minOccurs, p. Ej.

<xsd:complexType name="Parent"> 
    <xsd:sequence> 
    <xsd:element minOccurs="1" maxOccurs="5" name="Child" type="q10:string"/> 
    </xsd:sequence> 
</xsd:complexType> 
+0

No es exactamente lo que pretendía. Por favor, vea la pregunta actualizada que con suerte aclara la intención. – joedotnot

0

Puede crear un grupo de sustitución que incorpore todos sus elementos secundarios. Para esto, usa el atributo minOccurs para especificar que al menos un elemento del grupo debe aparecer en el documento.

+0

No creo que esto funcione; los elementos del grupo de sustitución deben de alguna manera estar relacionados o derivarse el uno del otro; mis elementos son totalmente independientes, como se menciona en mi pregunta. – joedotnot

0

El uso de afirmaciones (creo que sólo está disponible en XSD 1.1) es posible hacer lo siguiente:

<xs:element name="Parent"> 
    <xs:complexType> 
     <xs:sequence> 
      <xs:element name="Child1" type="xs:string" minOccurs="0"/> 
      <xs:element name="Child2" minOccurs="0"/> 
      <xs:element name="Child3" minOccurs="0"/> 
     </xs:sequence> 
     <xs:assert test="count(*)>=1"/> 
    </xs:complexType> 
</xs:element> 
Cuestiones relacionadas