2010-01-15 9 views
5

¿Es posible definir en XSD el siguiente escenario:esquema XML - elementos secundarios que dependen de la existencia de atributo opcional

  1. Elemento principal tiene un atributo que

    es opcional.

  2. Si el atributo no es

    present in XML, at least one child 
    
    element must exists. 
    
  3. Si el

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

Ejemplo:

VALID

<parent externel-source="some_name" /> 



<parent externel-source="some_name"> 

    <child>some value</child> 

</parent> 



<parent> 

    <child> some value</child> 

</parent> 

NO VÁLIDA

<parent /> 

Respuesta

-1

No creo que no.

+0

Respuestas de este tipo no son satisfactorios para mí. ¿Cuál es el razonamiento detrás de su declaración? –

+2

Los tipos de esquema XML son muy similares a los tipos de programación OO. Puede crear un tipo complejo y puede restringir el orden de los elementos tipo de elemento y atributo y la restricción sobre qué tipo de valores se pueden asignar. Eso es todo lo que xsd puede hacer por usted. Lo que quiere es algo de restricción que abarca más de un elemento/atributo que simplemente no es posible con xsd. tienes que escribir tu propio código para validar esto. – affan

+0

También creo que no es posible, y que decir eso es una muy buena respuesta (si es correcta) :-) –

3

No .. el motivo es: en su caso, está tratando de validar la presencia de un elemento/etiqueta según el valor de alguna otra etiqueta/atributo ... (XSD es básicamente un conjunto de declaraciones) que requiere múltiples declaración de un mismo elemento .. no se permite
declaración múltiple de un mismo elemento en XSD .. :-(
Mira la similar problem (click here) publicado por un miembro Stackoverflow

0

momento de resucitar este mensaje, pero pensé Podría añadir un poco sobre el "por qué" de las cosas. W3C XML Schema requiere que todas sus secuencias sean completamente deterministas. Por razones de rendimiento/simplicidad, no está diseñado para mirar hacia adelante o mirar hacia atrás, solo funciona en el elemento actual. También creo que esto es heredado de SGML.

Lo que quiere hacer requiere tal funcionalidad. Es posible que desee ver Schematron; es compatible con lo que quieres.

0

Sí, definitivamente puedes, usando xsi: tipo (¡que probablemente no es lo que quieres!). Por ejemplo, con el xsd a continuación;

<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>  

de obtener una instancia que tiene ya sea un atributo o una o más niños, pero hay que tener xsi: type en la instancia que puede o no puede ser un show-tapón.

<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> 

Cuestiones relacionadas