Agregar patrones a un elemento con atributos en un W3C XML Schema

26.11.08. Por ooscarr (ooscarr)

Llevo 3 días sufriendo pensando y probando todas las combinaciones posibles para agregar una restricción de patrón a un elemento con atributos. Finalmente di con la respuesta. Era mi primer XML Schema.

Explicar qué es y cómo se escribe un XML Schema da para largo y todavía no estoy muy seguro de algunos aspectos más avanzados, así que no lo voy a hacer (a menos que me sobre el tiempo).

Así que por lo que pude probar usando el excelente editor de XML Schema de netbeans (seguramente basado en algún validador de XML Schemas del W3C), sólo podía agregar restricciones a:

  • Elementos simples sin atributos
  • Elementos complejos con elementos hijos

Pero yo necesitaba agregar una restricción al contenido de un elemento con atributos a mi W3C XML Schema.

Problema

Digamos que tengo la siguiente etiqueta en mi XML:

<title type="text">A1</title>

...y necesito agregarle las siguientes restricciones de XML Schema:

<xsd:restriction base="xsd:string">
 <xsd:pattern value="[A-Z]+[0-9]+"/>
 <xsd:minLength value="2"/>
</xsd:restriction>

(Sí, se tratan de celdas de una planilla de cálculo)

Solución

Y la manera en que lo logré fue... ¡Ah! ¡Primero deja explicar que tenia un namespace llamado tns en la cabecera! (Poco relevante)

<?xml version="1.0" encoding="UTF-8"?>
<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema"
 targetNamespace="http://www.ooscarr.com"
 xmlns:tns="http://www.ooscarr.com"
 elementFormDefault="qualified">

W3C XML Schema

Primero creé un tipo simple llamado ncelda

<xsd:simpleType name="ncelda">
 <xsd:restriction base="xsd:string">
  <xsd:pattern value="[A-Z]+[0-9]+"/>
 </xsd:restriction>
</xsd:simpleType>

Luego creé un tipo complejo llamado titulo basado en el ncelda

<xsd:complexType name="titulo">
 <xsd:simpleContent>
  <xsd:extension base="tns:ncelda">
   <xsd:attribute name="type" type="xsd:string"/>
  </xsd:extension>
 </xsd:simpleContent>
</xsd:complexType>

Y finalmente, agregué el elemento title de tipo titulo

<xsd:element name="title" type="tns:titulo"/>

Fin.

Con Netbeans

Netbeans

Para hacer lo mismo con la interfaz gráfica de netbeans; (de los 3: Source, Schema y Design) en el modo Schema, es cosa de

  1. agregar un Simple Type...
    Menú contextual Agregar un Simple Type...
  2. llamarlo ncelda
  3. con el método de derivación restriction
  4. usando la definición existente Built-in Types > string

Menú contextual Propiedades

Después ir a las propiedades del tipo creado y agregar al patrón (Pattern) la expresión regular

[A-Z]+[0-9]+

Y de ahí,

  1. Se crea el elemento complejo llamado titulo
  2. Lo personalizamos
    menú contextual, opción Personalizar
    y usamos la extensión existente ncelda
    Global Complex Type customizer
  3. Después creamos el elemento title usando el tipo existente titulo y le agregamos el atributo type
    menú contextual de agregar atributo

árbol del esquema en el modo Schema del editor de XML Schema de netbeans

0 Error(s),  0 Warning(s).

Etiquetas: ,

0 comentarios (RSS ATOM) :

Página principal

Publicidad