es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Aquí, bajo el elemento padre, hay algunos elementos con una propiedad que no debe repetirse y otros que pueden repetirse en cualquier orden.

Estoy tratando de definir xsd para el siguiente XML:

<note>
<to>Tove</to>
<from>Jani</from>
<heading>Reminder</heading>
<body>Don't forget me this weekend!</body>
<to>Tove</to>
</note>

He definido el siguiente XSD para el anterior:

<xs:schema attributeformdefault="unqualified" elementformdefault="qualified" xmlns:xs="http://www.w3.org/2001/XMLSchema">
  <xs:element name="note">
    <xs:complextype>
      <xs:choice maxoccurs="unbounded" minoccurs="0">
        <xs:element type="xs:string" name="to"></xs:element>
        <xs:element type="xs:string" name="from"></xs:element>
        <xs:element type="xs:string" name="heading"></xs:element>
        <xs:element type="xs:string" name="body"></xs:element>
      </xs:choice>
    </xs:complextype>
  </xs:element>
</xs:schema>

Pero la parte complicada aquí es cómo puedo definir solo el elemento “to” repetido cualquier número de veces y en cualquier orden, pero “from”, “heading” y “body” repetidos solo una vez. ¿Cómo puedo mantener este tipo de restricción en el XSD?

Tags:  ,

Answer

  1. Avatar for davy.ai

    Para limitar la repetición de elementos específicos en un XSD, podemos utilizar los atributos “maxOccurs” y “minOccurs”. En este caso, queremos que el elemento “to” sea repetible, así que establecemos “maxOccurs” en “unbounded” y “minOccurs” en “0”. Para los elementos “from”, “heading” y “body”, queremos que estén restringidos a una única aparición, así que establecemos “maxOccurs” en “1” y “minOccurs” en “1”.

    Aquí está el XSD actualizado que incluye estas restricciones:

    <xs:schema attributeformdefault="unqualified" elementformdefault="qualified" xmlns:xs="http://www.w3.org/2001/XMLSchema">
      <xs:element name="note">
        <xs:complextype>
          <xs:sequence>
            <xs:element type="xs:string" name="from" maxoccurs="1" minoccurs="1"></xs:element>
            <xs:element type="xs:string" name="heading" maxoccurs="1" minoccurs="1"></xs:element>
            <xs:element type="xs:string" name="body" maxoccurs="1" minoccurs="1"></xs:element>
            <xs:element type="xs:string" name="to" maxoccurs="unbounded" minoccurs="0"></xs:element>
          </xs:sequence>
        </xs:complextype>
      </xs:element>
    </xs:schema>
    

    Ten en cuenta que hemos cambiado el elemento “xs:choice” por “xs:sequence” porque queremos imponer un orden específico para los elementos. También hemos reordenado los elementos de manera que los elementos “from”, “heading” y “body” vengan antes del elemento “to”.

    Con este XSD, cualquier documento XML que no cumpla estas restricciones se considerará inválido.

Comments are closed.