Saltar al contenido

XSD: ¿cómo permitir elementos en cualquier orden cualquier cantidad de veces?

No dudes en compartir nuestra web y códigos en tus redes sociales, necesitamos de tu ayuda para ampliar nuestra comunidad.

Solución:

La formulación alternativa de la pregunta añadida en una edición posterior parece aún sin respuesta: cómo especificar que entre los hijos de un elemento, debe haber uno llamado child3uno llamado child4y cualquier número llamado child1 o child2sin restricción en el orden en que aparecen los elementos secundarios.

Este es un lenguaje regular fácilmente definible, y el modelo de contenido que necesita es isomorfo a una expresión regular que define el conjunto de cadenas en las que los dígitos ‘3’ y ‘4’ aparecen exactamente una vez, y los dígitos ‘1’ y ‘2 ‘ ocurrir cualquier número de veces. Si no es obvio cómo escribir esto, puede ser útil pensar en qué tipo de máquina de estados finitos construiría para reconocer dicho lenguaje. Tendría al menos cuatro estados distintos:

  • un estado inicial en el que no se ha visto ni ‘3’ ni ‘4’
  • un estado intermedio en el que se ha visto ‘3’ pero no ‘4’
  • un estado intermedio en el que se ha visto ‘4’ pero no ‘3’
  • un estado final en el que se han visto tanto el ‘3’ como el ‘4’

No importa en qué estado se encuentre el autómata, se pueden leer ‘1’ y ‘2’; no cambian el estado de la máquina. En el estado inicial, también se aceptará ‘3’ o ‘4’; en los estados intermedios sólo se acepta ‘4’ o ‘3’; en el estado final, no se acepta ni ‘3’ ni ‘4’. La estructura de la expresión regular es más fácil de entender si primero definimos una expresión regular para el subconjunto de nuestro idioma en el que solo aparecen ‘3’ y ‘4’:

(34)|(43)

Para permitir que ‘1’ o ‘2’ ocurran cualquier número de veces en una ubicación dada, podemos insertar (1|2)* (o [12]* si nuestro lenguaje regex acepta esa notación). Insertando esta expresión en todas las ubicaciones disponibles, obtenemos

(1|2)*((3(1|2)*4)|(4(1|2)*3))(1|2)*

Traducir esto a un modelo de contenido es sencillo. La estructura básica es equivalente a la expresión regular (34)|(43):


  
    
      
      
    
    
      
      
    
  

Insertar una opción de cero o más de child1 y child2 es sencillo:


  
    
      
      
          
    
      
        
        
          
          
              
        
      
      
        
        
          
          
              
        
      
    
    
      
      
          
  

Si queremos minimizar un poco el volumen, podemos definir un grupo con nombre para las opciones repetidas de child1 y child2:


  
    
    
     



  
    
    
      
        
        
        
      
      
        
        
        
      
      
    
  

En XSD 1.1, algunas de las limitaciones de all-se han eliminado los grupos, por lo que es posible definir este modelo de contenido de manera más concisa:


  
    
    
    
          
  

Pero como se puede ver en los ejemplos dados anteriormente, estos cambios en all-los grupos de hecho no cambian el poder expresivo de la lengua; solo hacen que la definición de ciertos tipos de lenguajes sea más sucinta.

En el esquema que tienes en tu pregunta, child1 o child2 puede aparecer en cualquier orden, cualquier número de veces. Así que esto suena como lo que estás buscando.

Editar: si quisiera que solo uno de ellos apareciera un número ilimitado de veces, el ilimitado tendría que ir en los elementos en su lugar:

Editar: Tipo fijo en XML.

Editar: O mayúscula en maxOccurs


   
     
       
       
     
   

Esto es lo que finalmente funcionó para mí:


  
    
      
      
        
        
        
      
    
  

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)


Tags : / /

Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *