<?xml version="1.0" encoding="ISO-8859-1"?>
<!--
    Copyright 2009, 2010, 2011, 2012, 2013, 2014, 2015, 2016 Newport Software Technologies, UNICEN

    This file is part of XGAP.

    XGAP is free software: you can redistribute it and/or modify
    it under the terms of the GNU Affero General Public License as published by
    the Free Software Foundation, either version 3 of the License, or
    (at your option) any later version.

    XGAP is distributed in the hope that it will be useful,
    but WITHOUT ANY WARRANTY; without even the implied warranty of
    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
    GNU Affero General Public License for more details.

    You should have received a copy of the GNU Affero General Public License
    along with XGAP.  If not, see <http://www.gnu.org/licenses/>.
-->
<!--
Este esquema documenta la estructura de los campos de formulario, pero
definiendo cada tipo de campo como un elemento diferente (en vez de un único
elemento "campo") y con la estructura interna específica del tipo.

== ¿Por qué la diferencia con formulario.xsd?

Cada tipo de campo tiene una estructura (elementos y atributos) específica, pero
actualmente no es posible diferenciarlos en el esquema XML que los define; la
definición actual del elemento "campo" contiene la unión de los subelementos y
atributos de todos los tipos de campo.
Esto es así porque en el esquema actual el tipo de un campo se establece por
medio del atributo campo/@tipo, y en el esquema XML no es posible definir
estructuras diferentes para un elemento de acuerdo a un atributo.
La solución sería reestructurar la definición de los campos para que cada tipo
esté representado por un elemento diferente, no por un atributo.
En este esquema se indica cómo podría quedar la estructura de los campos si en
algún momento se deja de lado la compatibilidad hacia atrás y se reconstruye,
además de servir como documentación de la estructura real de cada tipo de campo.
-->
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
    <xs:complexType name="empty">
        <xs:annotation>
            <xs:documentation>Define un elemento que no puede tener contenido.</xs:documentation>
        </xs:annotation>
    </xs:complexType>
    <xs:simpleType name="stringNotEmpty">
        <xs:restriction base="xs:string">
            <xs:minLength value="1"/>
        </xs:restriction>
    </xs:simpleType>
    <xs:simpleType name="normalizedStringNotEmpty">
        <xs:restriction base="xs:normalizedString">
            <xs:minLength value="1"/>
        </xs:restriction>
    </xs:simpleType>
    <!--+
        | El elemento "campo" definido en formulario.xsd contiene la unión de las estructuras
        | de todos los posibles @tipo, con lo cual no sirve para validar que la estructura para
        | un @tipo particular sea correcta, es decir, que no incluya elementos o atributos que
        | sólo se usan en otro @tipo.
        |
        | El esquema definido en este archivo reestructura la especificación de campo,
        | especificando por separado la estructura de cada tipo diferente.
        |
        | Por el momento sirve sólo como documentación,
        | pero eventualmente se puede rehacer la especificación de los campos para que use este esquema.
        | La nueva definición en formulario.xsd sería de la forma:
        |
        | <xs:group name="estructura-campos">
        |     <xs:choice>
        |         <xs:element ref="grupo" />
        |         <xs:group ref="campo-formulario"/>
        |         <xs:element ref="separador_grupo" />
        |     </xs:choice>
        | </xs:group>
        +-->
    <xs:group name="campo-formulario">
        <xs:choice>
            <!-- TODO: definir los tipos faltantes -->
            <xs:element name="texto">
                <xs:annotation>
                    <xs:documentation>Define un campo de texto.</xs:documentation>
                </xs:annotation>
                <xs:complexType>
                    <xs:sequence>
                        <xs:element ref="dato"/>
                        <xs:element ref="nombre" minOccurs="0"/>
                        <xs:element ref="titulo"/>
                        <xs:element ref="tip" minOccurs="0"/>
                        <xs:element ref="default" minOccurs="0"/>
                        <xs:element ref="preparar-valor" minOccurs="0"/>
                        <xs:element name="autocompletable" minOccurs="0" type="campo-autocompletable">
                            <xs:annotation>
                                <xs:documentation>
                                    Indica que el campo debe proveer autocompletado de valores.
                                    Luego que el usuario haya tipeado al menos @long-min caracteres y tras una demora de @demora, se consulta dinámicamente al servidor
                                    y se le presenta una lista de valores que cumplan la condición @comparacion respecto al texto ingresado, en la cual puede seleccionar uno.
                                </xs:documentation>
                            </xs:annotation>
                        </xs:element>
                        <xs:element ref="condicion-campo-visible" minOccurs="0"/>
                    </xs:sequence>
                    <xs:attribute ref="solo-lectura"/>
                    <xs:attribute ref="requerido" use="optional"/>
                    <xs:attribute name="ancho" type="xs:positiveInteger">
                        <xs:annotation>
                            <xs:documentation>Ancho sugerido del campo, en caracteres.</xs:documentation>
                        </xs:annotation>
                    </xs:attribute>
                    <xs:attribute name="ancho-maximo" type="xs:positiveInteger">
                        <xs:annotation>
                            <xs:documentation>Ancho máximo, en cantidad de caracteres</xs:documentation>
                        </xs:annotation>
                    </xs:attribute>
                    <xs:attribute name="mayusculas" use="optional" default="false" type="xs:boolean">
                        <xs:annotation>
                            <xs:documentation>
                                Indica si el valor del campo se convierte automáticamente a mayúsculas.
                                Tiene prioridad sobre el parámetro de configuración 'texto_form_mayusculas'.
                            </xs:documentation>
                        </xs:annotation>
                    </xs:attribute>
                </xs:complexType>
            </xs:element>
            <xs:element name="archivo">
                <xs:annotation>
                    <xs:documentation>
                        Define un campo que permite subir un archivo al servidor.
                        Utiliza el parámetro de configuración "upload_dir".
                    </xs:documentation>
                </xs:annotation>
                <xs:complexType>
                    <xs:sequence>
                        <xs:element ref="dato"/>
                        <xs:element ref="nombre" minOccurs="0"/>
                        <xs:element ref="titulo"/>
                        <xs:element ref="tip" minOccurs="0"/>
                        <xs:element name="destino" type="xs:string" minOccurs="0">
                            <xs:annotation>
                                <xs:documentation>Ruta destino del archivo, relativa al directorio base.</xs:documentation>
                            </xs:annotation>
                        </xs:element>
                        <xs:element ref="default" minOccurs="0"/>
                        <xs:element ref="preparar-valor" minOccurs="0"/>
                        <xs:element ref="condicion-campo-visible" minOccurs="0"/>
                    </xs:sequence>
                    <xs:attribute name="ancho" type="xs:positiveInteger">
                        <xs:annotation>
                            <xs:documentation>Ancho sugerido del campo, en caracteres.</xs:documentation>
                        </xs:annotation>
                    </xs:attribute>
                    <xs:attribute ref="requerido" use="optional"/>
                </xs:complexType>
            </xs:element>
            <xs:element name="checkbox">
                <xs:annotation>
                    <xs:documentation><![CDATA[Genera un check box (<input type="checkbox" ... />).]]></xs:documentation>
                </xs:annotation>
                <xs:complexType>
                    <xs:sequence>
                        <xs:element ref="dato"/>
                        <xs:element ref="nombre" minOccurs="0"/>
                        <xs:element name="titulo" type="titulo-campo-posicionado"/>
                        <xs:element ref="tip" minOccurs="0"/>
                        <xs:element name="valores">
                            <xs:complexType>
                                <xs:sequence>
                                    <xs:element name="chequeado" type="xs:normalizedString">
                                        <xs:annotation>
                                            <xs:documentation>
                                                <![CDATA[
                                                Valor que corresponde al campo cuando el control está chequeado.
                                                Durante la inicialización, cualquier valor distinto de éste hace que el control quede sin chequear.
                                                Por ejemplo:
                                                <chequeado>1</chequeado>
                                                <chequeado>'t'</chequeado>
                                                <chequeado>Conexion::sqlstr2php(XGAP_CONF_VALOR_VERDADERO_SQL)</chequeado>
                                                ]]>
                                            </xs:documentation>
                                        </xs:annotation>
                                    </xs:element>
                                    <xs:element name="no-chequeado" type="xs:normalizedString">
                                        <xs:annotation>
                                            <xs:documentation>
                                                <![CDATA[
                                                Valor que corresponde al campo cuando el control no está chequeado.
                                                Por ejemplo:
                                                <no-chequeado>0</no-chequeado>
                                                <no-chequeado>'f'</no-chequeado>
                                                <no-chequeado>Conexion::sqlstr2php(XGAP_CONF_VALOR_FALSO_SQL)</no-chequeado>
                                                ]]>
                                            </xs:documentation>
                                        </xs:annotation>
                                    </xs:element>
                                </xs:sequence>
                            </xs:complexType>
                        </xs:element>
                        <xs:element ref="default" minOccurs="0"/>
                        <xs:element ref="preparar-valor" minOccurs="0"/>
                        <xs:element ref="condicion-campo-visible" minOccurs="0"/>
                    </xs:sequence>
                    <xs:attribute ref="no_editable" use="optional"/>
                    <xs:attribute name="chequeado" type="xs:boolean" use="optional">
                        <xs:annotation>
                            <xs:documentation>Indica si el campo debe estar inicialmente chequeado o no.</xs:documentation>
                        </xs:annotation>
                    </xs:attribute>
                    <xs:attribute ref="requerido" use="optional"/>
                </xs:complexType>
            </xs:element>
            <xs:element name="combo">
                <xs:annotation>
                    <xs:documentation>Define un campo de tipo combo (lista desplegable), cuyos valores posibles se dan por enumeración.</xs:documentation>
                </xs:annotation>
                <xs:complexType>
                    <xs:sequence>
                        <xs:element ref="dato"/>
                        <xs:element ref="nombre" minOccurs="0"/>
                        <xs:element ref="titulo"/>
                        <xs:element ref="tip" minOccurs="0"/>
                        <xs:element name="select" type="lista-options"/>
                        <xs:element ref="default" minOccurs="0"/>
                        <xs:element ref="preparar-valor" minOccurs="0"/>
                        <xs:element ref="condicion-campo-visible" minOccurs="0"/>
                    </xs:sequence>
                    <xs:attribute name="clave" type="xs:boolean" default="false">
                        <xs:annotation>
                            <xs:documentation>Indica que es un campo clave.</xs:documentation>
                        </xs:annotation>
                    </xs:attribute>
                    <xs:attribute ref="requerido" use="optional"/>
                </xs:complexType>
            </xs:element>
            <xs:element name="lista">
                <xs:annotation>
                    <xs:documentation>
                        Define un campo de tipo lista con selección múltiple, cuyos valores posibles se dan por enumeración.
                        Este campo no guarda automáticamente los valores seleccionados en la base de datos, sino que se debe
                        hacer mediante código personalizado en la página.
                    </xs:documentation>
                </xs:annotation>
                <xs:complexType>
                    <xs:sequence>
                        <xs:element ref="dato"/>
                        <xs:element ref="nombre" minOccurs="0"/>
                        <xs:element ref="titulo"/>
                        <xs:element ref="tip" minOccurs="0"/>
                        <xs:element name="select" type="lista-options"/>
                        <xs:choice>
                            <xs:element name="consulta-sm" type="consulta-seleccion-multiple">
                                <xs:annotation>
                                    <xs:documentation>Define la consulta a realizar para obtener los elementos que deben estar seleccionados inicialmente.</xs:documentation>
                                </xs:annotation>
                            </xs:element>
                            <xs:element ref="codigo-seleccion-inicial"/>
                        </xs:choice>
                        <xs:element ref="preparar-valor" minOccurs="0"/>
                        <xs:element ref="controles-seleccion-lista" minOccurs="0"/>
                        <xs:element ref="condicion-campo-visible" minOccurs="0"/>
                    </xs:sequence>
                    <xs:attribute ref="requerido"/>
                    <xs:attribute name="filas" type="xs:nonNegativeInteger">
                        <xs:annotation>
                            <xs:documentation>
                                Cantidad de elementos a mostrar en la lista (atributo size del select).
                                Si no está presente, se muestran 3 elementos; si es 0, no se genera el atributo.
                            </xs:documentation>
                        </xs:annotation>
                    </xs:attribute>
                </xs:complexType>
            </xs:element>
            <xs:element name="radio">
                <xs:annotation>
                    <xs:documentation>Define un campo formado por un grupo de radio buttons, cuyos valores posibles se dan por enumeración.</xs:documentation>
                </xs:annotation>
                <xs:complexType>
                    <xs:sequence>
                        <xs:element ref="dato"/>
                        <xs:element ref="nombre" minOccurs="0"/>
                        <xs:element ref="titulo"/>
                        <xs:element ref="tip" minOccurs="0"/>
                        <xs:element name="select" type="lista-options"/>
                        <xs:element ref="default" minOccurs="0"/>
                        <xs:element ref="preparar-valor" minOccurs="0"/>
                        <xs:element ref="condicion-campo-visible" minOccurs="0"/>
                    </xs:sequence>
                    <xs:attribute name="orientacion" type="orientacion" default="h">
                        <xs:annotation>
                            <xs:documentation>¿Los elementos del grupo se deben colocar de forma horizontal o vertical?</xs:documentation>
                        </xs:annotation>
                    </xs:attribute>
                    <xs:attribute ref="requerido" use="optional"/>
                </xs:complexType>
            </xs:element>
            <xs:element name="combobd">
                <xs:annotation>
                    <xs:documentation>Define un campo de tipo combo (lista desplegable), cuyos valores posibles se obtienen de la base de datos.</xs:documentation>
                </xs:annotation>
                <xs:complexType>
                    <xs:sequence>
                        <xs:element ref="dato"/>
                        <xs:element ref="nombre" minOccurs="0"/>
                        <xs:element ref="titulo"/>
                        <xs:element ref="tip" minOccurs="0"/>
                        <xs:element name="consulta" type="consulta"/>
                        <xs:element ref="default" minOccurs="0"/>
                        <xs:element name="opcion-seleccion-vacia" minOccurs="0">
                            <xs:annotation>
                                <xs:documentation>Permite personalizar la opción del combo que corresponde a selección vacía.</xs:documentation>
                            </xs:annotation>
                            <xs:complexType>
                                <!-- El default debe ser igual al valor de Form::COMBO_TEXTO_OPCION_VACIA -->
                                <xs:attribute name="texto" type="normalizedStringNotEmpty" default="--">
                                    <xs:annotation>
                                        <xs:documentation>Texto a mostrar en la opción</xs:documentation>
                                    </xs:annotation>
                                </xs:attribute>
                            </xs:complexType>
                        </xs:element>
                        <xs:element ref="preparar-valor" minOccurs="0"/>
                        <xs:element ref="condicion-campo-visible" minOccurs="0"/>
                    </xs:sequence>
                    <xs:attribute name="clave" type="xs:boolean" default="false">
                        <xs:annotation>
                            <xs:documentation>Indica que es un campo clave.</xs:documentation>
                        </xs:annotation>
                    </xs:attribute>
                    <xs:attribute name="ancho" type="xs:positiveInteger">
                        <xs:annotation>
                            <xs:documentation>Ancho en pixels del combo</xs:documentation>
                        </xs:annotation>
                    </xs:attribute>
                    <xs:attribute ref="requerido" use="optional"/>
                </xs:complexType>
            </xs:element>
            <xs:element name="listabd">
                <xs:annotation>
                    <xs:documentation>
                        Define un campo de tipo lista con selección múltiple, cuyos valores posibles se obtienen de la base de datos.
                        Este campo no guarda automáticamente los valores seleccionados en la base de datos, sino que se debe
                        hacer mediante código personalizado en la página.
                    </xs:documentation>
                </xs:annotation>
                <xs:complexType>
                    <xs:sequence>
                        <xs:element ref="dato"/>
                        <xs:element ref="nombre" minOccurs="0"/>
                        <xs:element ref="titulo"/>
                        <xs:element ref="tip" minOccurs="0"/>
                        <xs:element name="consulta" type="consulta"/>
                        <xs:choice>
                            <xs:element name="consulta-sm" type="consulta-seleccion-multiple">
                                <xs:annotation>
                                    <xs:documentation>Define la consulta a realizar para obtener los elementos que deben estar seleccionados inicialmente.</xs:documentation>
                                </xs:annotation>
                            </xs:element>
                            <xs:element ref="codigo-seleccion-inicial"/>
                        </xs:choice>
                        <xs:element ref="preparar-valor" minOccurs="0"/>
                        <xs:element ref="controles-seleccion-lista" minOccurs="0"/>
                        <xs:element ref="condicion-campo-visible" minOccurs="0"/>
                    </xs:sequence>
                    <xs:attribute name="filas" type="xs:nonNegativeInteger">
                        <xs:annotation>
                            <xs:documentation>
                                Cantidad de elementos a mostrar en la lista (atributo size del select).
                                Si no está presente, se muestran 3 elementos; si es 0, no se genera el atributo.
                            </xs:documentation>
                        </xs:annotation>
                    </xs:attribute>
                    <xs:attribute ref="requerido" use="optional"/>
                </xs:complexType>
            </xs:element>
            <xs:element name="radiobd">
                <xs:annotation>
                    <xs:documentation>Define un campo formado por un grupo de radio buttons, cuyos valores posibles se obtienen de la base de datos.</xs:documentation>
                </xs:annotation>
                <xs:complexType>
                    <xs:sequence>
                        <xs:element ref="dato"/>
                        <xs:element ref="nombre" minOccurs="0"/>
                        <xs:element ref="titulo"/>
                        <xs:element ref="tip" minOccurs="0"/>
                        <xs:element name="consulta" type="consulta"/>
                        <xs:element ref="default" minOccurs="0"/>
                        <xs:element ref="preparar-valor" minOccurs="0"/>
                        <xs:element ref="condicion-campo-visible" minOccurs="0"/>
                    </xs:sequence>
                    <xs:attribute name="orientacion" type="orientacion" default="h">
                        <xs:annotation>
                            <xs:documentation>¿Los elementos del grupo se deben colocar de forma horizontal o vertical?</xs:documentation>
                        </xs:annotation>
                    </xs:attribute>
                    <xs:attribute ref="requerido" use="optional"/>
                </xs:complexType>
            </xs:element>
            <xs:element name="link">
                <xs:annotation>
                    <xs:documentation><![CDATA[Genera un link (<a href=...).]]></xs:documentation>
                </xs:annotation>
                <xs:complexType>
                    <xs:sequence>
                        <xs:element ref="dato">
                            <xs:annotation>
                                <xs:documentation>El texto del link se obtiene del valor del dato, si no está presente el elemento etiqueta.</xs:documentation>
                            </xs:annotation>
                        </xs:element>
                        <xs:element ref="nombre" minOccurs="0"/>
                        <xs:element ref="titulo"/>
                        <xs:element ref="tip" minOccurs="0"/>
                        <xs:element name="destino">
                            <!-- Corresponde a destino-link en el esquema actual. -->
                            <xs:annotation>
                                <xs:documentation>Destino del link.</xs:documentation>
                            </xs:annotation>
                            <xs:complexType>
                                <xs:sequence>
                                    <xs:element name="url" type="xs:normalizedString"/>
                                    <xs:element name="parametros" minOccurs="0">
                                        <xs:complexType>
                                            <xs:sequence>
                                                <xs:element name="parametro" maxOccurs="unbounded">
                                                    <xs:annotation>
                                                        <xs:documentation>
                                                            Define un parámetro del request.
                                                            Debe incluir un atributo de cada uno de los grupos
                                                            {@nombre | @nombre-expr} y {@dato | @expr | @valor}.
                                                        </xs:documentation>
                                                    </xs:annotation>
                                                    <xs:complexType>
                                                        <xs:attribute name="nombre-expr" type="xs:normalizedString">
                                                            <xs:annotation>
                                                                <xs:documentation>
                                                                    Nombre del parámetro del request, evaluado como una expresión PHP.
                                                                    Si está presente, no se tiene en cuenta @nombre.
                                                                </xs:documentation>
                                                            </xs:annotation>
                                                        </xs:attribute>
                                                        <xs:attribute name="nombre" type="xs:normalizedString">
                                                            <xs:annotation>
                                                                <xs:documentation>Nombre del parámetro del request, evaluado como un string.</xs:documentation>
                                                            </xs:annotation>
                                                        </xs:attribute>
                                                        <xs:attribute name="dato" type="normalizedStringNotEmpty">
                                                            <xs:annotation>
                                                                <xs:documentation>
                                                                    Debe referenciar el elemento "dato" de uno de los campos.
                                                                    El valor del parámetro es el valor inicial del campo referenciado.
                                                                    Si está presente, no se tienen en cuenta @valor ni @expr.
                                                                </xs:documentation>
                                                            </xs:annotation>
                                                        </xs:attribute>
                                                        <xs:attribute name="expr" type="normalizedStringNotEmpty">
                                                            <xs:annotation>
                                                                <xs:documentation>
                                                                    Valor literal para el parámetro, evaluado como una expresión PHP.
                                                                    Si está presente, no se tiene en cuenta @valor.
                                                                </xs:documentation>
                                                            </xs:annotation>
                                                        </xs:attribute>
                                                        <xs:attribute name="valor" type="xs:normalizedString">
                                                            <xs:annotation>
                                                                <xs:documentation>Valor literal para el parámetro, evaluado como string.</xs:documentation>
                                                            </xs:annotation>
                                                        </xs:attribute>
                                                    </xs:complexType>
                                                </xs:element>
                                            </xs:sequence>
                                        </xs:complexType>
                                    </xs:element>
                                </xs:sequence>
                            </xs:complexType>
                        </xs:element>
                        <xs:element name="click" minOccurs="0" type="xs:normalizedString">
                            <xs:annotation>
                                <xs:documentation>Código a colocar en el atributo onclick del link.</xs:documentation>
                            </xs:annotation>
                        </xs:element>
                        <xs:element name="etiqueta" type="xs:normalizedString" minOccurs="0">
                            <xs:annotation>
                                <xs:documentation>Texto del link. Si no está presente se usa el valor de la columna indicada por dato.</xs:documentation>
                            </xs:annotation>
                        </xs:element>
                        <xs:element name="ventana" minOccurs="0">
                            <xs:annotation>
                                <xs:documentation>
                                    Si está presente, indica que el link se debe abrir en una nueva ventana.
                                    Si no, reemplaza la página en la ventana actual.
                                </xs:documentation>
                            </xs:annotation>
                            <xs:complexType>
                                <xs:attribute name="inline" type="xs:boolean" default="true">
                                    <xs:annotation>
                                        <xs:documentation>
                                            Si es 'true', se abre como un div dentro de la misma ventana.
                                            Si es 'false', se abre en una ventana separada.
                                        </xs:documentation>
                                    </xs:annotation>
                                </xs:attribute>
                                <xs:attribute name="nombre" type="xs:normalizedString">
                                    <xs:annotation>
                                        <xs:documentation>Nombre de la ventana. Sólo se usa si @inline='false'.</xs:documentation>
                                    </xs:annotation>
                                </xs:attribute>
                                <xs:attribute name="ancho" type="xs:normalizedString">
                                    <xs:annotation>
                                        <xs:documentation>Ancho de la ventana, incluyendo la unidad (ej: 90% o 750px)</xs:documentation>
                                    </xs:annotation>
                                </xs:attribute>
                                <xs:attribute name="alto" type="xs:normalizedString">
                                    <xs:annotation>
                                        <xs:documentation>Alto de la ventana, incluyendo la unidad (ej: 90% o 550px)</xs:documentation>
                                    </xs:annotation>
                                </xs:attribute>
                                <xs:attribute name="arriba" type="xs:normalizedString">
                                    <xs:annotation>
                                        <xs:documentation>
                                            Posición de la ventana desde arriba, incluyendo la unidad (ej: 5% o 30px).
                                            Sólo se usa si @inline='true'.
                                        </xs:documentation>
                                    </xs:annotation>
                                </xs:attribute>
                                <xs:attribute name="izquierda" type="xs:normalizedString">
                                    <xs:annotation>
                                        <xs:documentation>
                                            Posición de la ventana desde la izquierda, incluyendo la unidad (ej: 5% o 50px).
                                            Sólo se usa si @inline='true'.
                                        </xs:documentation>
                                    </xs:annotation>
                                </xs:attribute>
                            </xs:complexType>
                        </xs:element>
                        <xs:element ref="default" minOccurs="0"/>
                        <xs:element ref="preparar-valor" minOccurs="0"/>
                        <xs:element ref="condicion-campo-visible" minOccurs="0"/>
                    </xs:sequence>
                    <xs:attribute name="mostrar-deshabilitado" type="xs:boolean" default="true">
                        <xs:annotation>
                            <xs:documentation><![CDATA[
                                Cuando el link tiene destino vacío o no se puede acceder porque
                                lo impiden los permisos, ¿se debe mostrar como deshabilitado (true)
                                o se debe emitir el texto normal, como si no fuera de tipo
                                solo-lectura (false)?
                            ]]></xs:documentation>
                        </xs:annotation>
                    </xs:attribute>
                </xs:complexType>
            </xs:element>
            <xs:element name="oculto">
                <xs:annotation>
                    <xs:documentation>
                        Define un campo oculto, que genera un input de tipo hidden, pero no cambia la apariencia de la página.
                        El valor se obtiene de la base de datos.
                    </xs:documentation>
                </xs:annotation>
                <xs:complexType>
                    <xs:sequence>
                        <xs:element ref="dato">
                            <xs:annotation>
                                <xs:documentation>Nombre de la columna de la tabla que contiene el valor para el campo.</xs:documentation>
                            </xs:annotation>
                        </xs:element>
                        <xs:element ref="nombre" minOccurs="0"/>
                        <xs:element ref="default" minOccurs="0"/>
                        <xs:element ref="preparar-valor" minOccurs="0"/>
                    </xs:sequence>
                </xs:complexType>
            </xs:element>
            <xs:element name="constante">
                <xs:annotation>
                    <xs:documentation>
                        Define un campo oculto, que genera un input de tipo hidden, pero no cambia la apariencia de la página.
                        El valor es directamente el indicado en valor o funcion.
                    </xs:documentation>
                </xs:annotation>
                <xs:complexType>
                    <xs:sequence>
                        <xs:element ref="dato">
                            <xs:annotation>
                                <xs:documentation>Sólo se usa para definir el nombre del campo si no está presente el elemento nombre.</xs:documentation>
                            </xs:annotation>
                        </xs:element>
                        <xs:element ref="nombre" minOccurs="0"/>
                        <xs:choice>
                            <xs:element ref="valor">
                                <xs:annotation>
                                    <xs:documentation>Valor de la constante.</xs:documentation>
                                </xs:annotation>
                            </xs:element>
                            <!-- "funcion" es el nombre actual, pero un nombre más correcto sería "expresion",
                                 ya que este elemento permite usar cualquier expresión PHP, no sólo
                                 un llamado a función. -->
                            <xs:element name="funcion" type="xs:string">
                                <xs:annotation>
                                    <xs:documentation>
                                        <![CDATA[
                                        Genera el valor para el campo a partir de un llamado a función o método.
                                        El contenido debe ser la invocación a la función; por ejemplo:
                                        <funcion>htmlentities($_SERVER['PHP_SELF'])</funcion>
                                        ]]>
                                    </xs:documentation>
                                </xs:annotation>
                            </xs:element>
                        </xs:choice>
                    </xs:sequence>
                </xs:complexType>
            </xs:element>
            <xs:element name="sesion">
                <xs:annotation>
                    <xs:documentation>
                        Define un campo oculto, que genera un input de tipo hidden, pero no cambia la apariencia de la página.
                        El valor se obtiene de una variable de sesión.
                    </xs:documentation>
                </xs:annotation>
                <xs:complexType>
                    <xs:sequence>
                        <xs:element ref="dato">
                            <xs:annotation>
                                <xs:documentation>Sólo se usa para definir el nombre del campo si no está presente el elemento nombre.</xs:documentation>
                                <!-- NO ES CIERTO: si no está dato, la inicialización del campo queda incompleta en el archivo generado. -->
                            </xs:annotation>
                        </xs:element>
                        <xs:element ref="nombre" minOccurs="0"/>
                        <xs:element ref="valor">
                            <xs:annotation>
                                <xs:documentation>Nombre de la variable de sesión.</xs:documentation>
                            </xs:annotation>
                        </xs:element>
                        <xs:element ref="preparar-valor" minOccurs="0"/>
                    </xs:sequence>
                    <xs:attribute name="solo-alta" type="xs:boolean">
                        <xs:annotation>
                            <xs:documentation>
                                Indica que se debe tomar el valor de la sesión sólo durante el alta;
                                en modificación se debe tomar de la base, comportándose como si fuera &lt;oculto&gt;.
                            </xs:documentation>
                        </xs:annotation>
                    </xs:attribute>
                </xs:complexType>
            </xs:element>
            <xs:element name="solo-lectura">
                <xs:annotation>
                    <xs:documentation>
                        Define un campo que muestra información, pero no se puede editar.
                        Genera texto con el valor a mostrar y un hidden con el valor del dato.
                    </xs:documentation>
                </xs:annotation>
                <xs:complexType>
                    <xs:sequence>
                        <xs:element ref="dato"/>
                        <xs:element ref="nombre" minOccurs="0"/>
                        <xs:element ref="titulo"/>
                        <xs:element ref="tip" minOccurs="0"/>
                        <xs:element name="consulta" minOccurs="0">
                            <xs:annotation>
                                <xs:documentation>
                                    Define la consulta a hacer para obtener el valor a mostrar.
                                    Si no se incluye, se muestra el valor del dato.
                                </xs:documentation>
                            </xs:annotation>
                            <xs:complexType>
                                <xs:all>
                                    <xs:element name="tabla" type="xs:normalizedString">
                                        <xs:annotation>
                                            <xs:documentation>Nombre de la tabla a consultar.</xs:documentation>
                                        </xs:annotation>
                                    </xs:element>
                                    <xs:element name="valor" type="xs:normalizedString">
                                        <xs:annotation>
                                            <xs:documentation>Nombre de la columna que contiene el valor a buscar.</xs:documentation>
                                        </xs:annotation>
                                    </xs:element>
                                    <xs:element name="etiqueta" type="xs:normalizedString">
                                        <xs:annotation>
                                            <xs:documentation>Nombre de la columna que contiene el valor a mostrar.</xs:documentation>
                                        </xs:annotation>
                                    </xs:element>
                                    <xs:element name="where" type="xs:string" minOccurs="0">
                                        <xs:annotation>
                                            <xs:documentation>Condiciones extra para la cláusula WHERE.</xs:documentation>
                                        </xs:annotation>
                                    </xs:element>
                                    <xs:element name="depende" minOccurs="0">
                                        <xs:annotation>
                                            <xs:documentation>
                                                Define otros campos de los cuales depende el resultado de la consulta.
                                                Los valores de estos campos se incluyen en la cláusula WHERE.
                                                Sólo se usa si está definido el elemento "consulta".
                                            </xs:documentation>
                                        </xs:annotation>
                                        <xs:complexType>
                                            <xs:sequence>
                                                <xs:element name="campo" minOccurs="1" maxOccurs="unbounded">
                                                    <xs:annotation>
                                                        <xs:documentation>Nombre de un campo del que depende la consulta.</xs:documentation>
                                                    </xs:annotation>
                                                    <xs:complexType>
                                                        <xs:simpleContent>
                                                            <xs:extension base="xs:normalizedString">
                                                                <xs:attribute name="referencia" type="xs:normalizedString">
                                                                    <xs:annotation>
                                                                        <xs:documentation>
                                                                            Indica el nombre de la columna referenciada en la tabla destino.
                                                                            Si no está presente, se usa "dato" como nombre de columna.
                                                                        </xs:documentation>
                                                                    </xs:annotation>
                                                                </xs:attribute>
                                                            </xs:extension>
                                                        </xs:simpleContent>
                                                    </xs:complexType>
                                                </xs:element>
                                            </xs:sequence>
                                        </xs:complexType>
                                    </xs:element>
                                </xs:all>
                            </xs:complexType>
                        </xs:element>
                        <xs:element ref="default" minOccurs="0"/>
                        <xs:element ref="preparar-valor" minOccurs="0"/>
                        <xs:element ref="condicion-campo-visible" minOccurs="0"/>
                    </xs:sequence>
                    <xs:attribute name="ignorar-modificacion" type="xs:boolean" default="false">
                        <xs:annotation>
                            <xs:documentation>Un valor true indica que el campo _no_ se debe incluir en el UPDATE.</xs:documentation>
                        </xs:annotation>
                    </xs:attribute>
                </xs:complexType>
            </xs:element>
            <xs:element name="text-area">
                <xs:annotation>
                    <xs:documentation>Define un campo de tipo área de texto, con la longitud del texto limitada a un máximo.</xs:documentation>
                </xs:annotation>
                <xs:complexType>
                    <xs:sequence>
                        <xs:element ref="dato"/>
                        <xs:element ref="nombre" minOccurs="0"/>
                        <xs:element ref="titulo"/>
                        <xs:element ref="tip" minOccurs="0"/>
                        <xs:element ref="default" minOccurs="0"/>
                        <xs:element ref="preparar-valor" minOccurs="0"/>
                        <xs:element ref="condicion-campo-visible" minOccurs="0"/>
                    </xs:sequence>
                    <xs:attribute name="filas" type="xs:positiveInteger">
                        <xs:annotation>
                            <xs:documentation>Cantidad de filas del control.</xs:documentation>
                        </xs:annotation>
                    </xs:attribute>
                    <xs:attribute name="columnas" type="xs:positiveInteger">
                        <xs:annotation>
                            <xs:documentation>Cantidad de columnas del control.</xs:documentation>
                        </xs:annotation>
                    </xs:attribute>
                    <xs:attribute ref="solo-lectura"/>
                    <xs:attribute ref="requerido" use="optional"/>
                    <xs:attribute name="largo-maximo" type="xs:positiveInteger">
                        <xs:annotation>
                            <xs:documentation>Cantidad máxima de caracteres que puede contener el campo.</xs:documentation>
                        </xs:annotation>
                    </xs:attribute>
                    <xs:attribute name="mayusculas" use="optional" default="false" type="xs:boolean">
                        <xs:annotation>
                            <xs:documentation>
                                Indica si el valor del campo se convierte automáticamente a mayúsculas.
                                Tiene prioridad sobre el parámetro de configuración 'texto_form_mayusculas'.
                            </xs:documentation>
                        </xs:annotation>
                    </xs:attribute>
                </xs:complexType>
            </xs:element>
            <xs:element name="html-area">
                <xs:annotation>
                    <xs:documentation>Define un campo de tipo área de texto con formato.</xs:documentation>
                </xs:annotation>
                <xs:complexType>
                    <xs:sequence>
                        <xs:element ref="dato"/>
                        <xs:element ref="nombre" minOccurs="0"/>
                        <xs:element ref="titulo"/>
                        <xs:element ref="tip" minOccurs="0"/>
                        <xs:element ref="default" minOccurs="0"/>
                        <xs:element ref="preparar-valor" minOccurs="0"/>
                        <xs:element ref="condicion-campo-visible" minOccurs="0"/>
                    </xs:sequence>
                    <xs:attribute name="ancho" type="xs:normalizedString">
                        <xs:annotation>
                            <xs:documentation>
                                Ancho del control, dado en formato numérico o porcentual,
                                por ejemplo: "600" o "90%".
                            </xs:documentation>
                        </xs:annotation>
                    </xs:attribute>
                    <xs:attribute name="alto" type="xs:normalizedString">
                        <xs:annotation>
                            <xs:documentation>
                                Alto del control, dado en formato numérico o porcentual,
                                por ejemplo: "300" o "20%".
                            </xs:documentation>
                        </xs:annotation>
                    </xs:attribute>
                    <xs:attribute ref="solo-lectura"/>
                    <xs:attribute name="htmlarea-config" type="xs:normalizedString">
                        <xs:annotation>
                            <xs:documentation>
                                <![CDATA[
                                Ruta web a un archivo que especifica una configuración personalizada para el control.
                                Por ejemplo: htmlarea-config="scripts/conf.js" o htmlarea-config="$scripts_path/conf.js"
                                Sólo se aplica si @tipo = 'HtmlArea'.
                                ]]>
                            </xs:documentation>
                        </xs:annotation>
                    </xs:attribute>
                    <xs:attribute name="htmlarea-toolbars" type="xs:normalizedString">
                        <xs:annotation>
                            <xs:documentation>
                                Nombre del juego de barras de herramientas a usar en el control.
                                Sólo se aplica si @tipo = 'HtmlArea'.
                            </xs:documentation>
                        </xs:annotation>
                    </xs:attribute>
                    <xs:attribute ref="requerido" use="optional"/>
                </xs:complexType>
            </xs:element>
            <xs:element name="seleccionable-simple">
                <xs:annotation>
                    <xs:documentation>
                        <![CDATA[
                        Define un campo que permite seleccionar un valor, presentando un listado con la lista de valores posibles.
                        Dicho listado debe estar especificado en un archivo *_listado.xml y tener la salida seleccion habilitada
                        (/listado/generacion/salidas/seleccion).
                        ]]>
                    </xs:documentation>
                </xs:annotation>
                <xs:complexType>
                    <xs:sequence>
                        <xs:element ref="dato"/>
                        <xs:element ref="nombre" minOccurs="0"/>
                        <xs:element ref="titulo"/>
                        <xs:element ref="tip" minOccurs="0"/>
                        <xs:element ref="default" minOccurs="0"/>
                        <xs:element ref="preparar-valor" minOccurs="0"/>
                        <xs:element name="etiqueta" type="xs:normalizedString" minOccurs="0" default="Seleccionar">
                            <xs:annotation>
                                <xs:documentation>Texto del link que abre el listado de selección.</xs:documentation>
                            </xs:annotation>
                        </xs:element>
                        <xs:element name="tamanio" minOccurs="0" type="xs:normalizedString">
                            <xs:annotation>
                                <xs:documentation>
                                    Define el tamaño en que se abre el listado.
                                    El contenido debe estar en el formato aceptado por Configuracion::recuadroConMargen().
                                    El valor por defecto está dado por el parámetro de configuración tamanio_seleccionable_div.
                                </xs:documentation>
                            </xs:annotation>
                        </xs:element>
                        <xs:element name="entidad" type="entidad-seleccionable">
                            <xs:annotation>
                                <xs:documentation>Nombre de la entidad a la que corresponde el listado destino.</xs:documentation>
                            </xs:annotation>
                        </xs:element>
                        <xs:element name="tabla" type="xs:normalizedString" minOccurs="0">
                            <xs:annotation>
                                <xs:documentation>
                                    Nombre de la tabla que contiene el valor del campo.
                                    Si no está definido, se usa el elemento "entidad".
                                </xs:documentation>
                            </xs:annotation>
                        </xs:element>
                        <xs:element name="seleccionar" type="xs:normalizedString">
                            <xs:annotation>
                                <xs:documentation>Nombre de la columna del listado destino que contiene el valor que debe tomar el campo luego de realizar la selección.</xs:documentation>
                            </xs:annotation>
                        </xs:element>
                        <xs:element name="descripcion" type="xs:string">
                            <xs:annotation>
                                <xs:documentation>Nombre de la columna del listado destino que contiene el valor que debe mostrar el campo luego de realizar la selección (la descripción del valor seleccionado).</xs:documentation>
                            </xs:annotation>
                        </xs:element>
                        <xs:element name="actualiza" minOccurs="0">
                            <xs:annotation>
                                <xs:documentation>
                                    Indica que otros campos seleccionable-simple o seleccionable-multiple son dependientes de éste.
                                    Cuando se abre el listado de selección para este campo, se blanquea el valor de todos los actualiza/campo.
                                </xs:documentation>
                            </xs:annotation>
                            <xs:complexType>
                                <xs:sequence>
                                    <xs:element name="campo" minOccurs="1" maxOccurs="unbounded" type="xs:normalizedString">
                                        <xs:annotation>
                                            <xs:documentation>Nombre de un campo dependiente.</xs:documentation>
                                        </xs:annotation>
                                    </xs:element>
                                </xs:sequence>
                            </xs:complexType>
                        </xs:element>
                        <xs:element name="depende" type="seleccionable-depende" minOccurs="0">
                            <xs:annotation>
                                <xs:documentation>
                                    Define otros campos de cuyo valor dependen los valores disponibles para éste;
                                    por lo tanto, todos ellos deben tener valor antes de poder abrir este seleccionable.
                                    El valor de cada depende/campo se incluye en la cláusula WHERE del listado,
                                    al abrir el seleccionable.
                                </xs:documentation>
                            </xs:annotation>
                        </xs:element>
                        <xs:element ref="datos_adicionales" minOccurs="0"/>
                        <xs:element name="eventos" minOccurs="0">
                            <xs:annotation>
                                <xs:documentation>Permite registrar controladores javascript para responder a eventos producidos en el campo.</xs:documentation>
                            </xs:annotation>
                            <xs:complexType>
                                <xs:sequence>
                                    <xs:element name="select" minOccurs="0" maxOccurs="unbounded" type="xs:string">
                                        <xs:annotation>
                                            <xs:documentation>
                                                Registra un controlador para el evento select.
                                                El contenido debe ser una expresión javascript que retorne el objeto Function a registrar.
                                            </xs:documentation>
                                        </xs:annotation>
                                    </xs:element>
                                </xs:sequence>
                            </xs:complexType>
                        </xs:element>
                        <xs:element name="descripcion-autocompletable" minOccurs="0" type="campo-autocompletable">
                            <xs:annotation>
                                <xs:documentation>
                                    Indica que el campo debe proveer autocompletado de valores.
                                    Luego que el usuario haya tipeado al menos @long-min caracteres y tras una demora de @demora, se consulta dinámicamente al servidor
                                    y se le presenta una lista de valores que cumplan la condición @comparacion respecto al texto ingresado, en la cual puede seleccionar uno.
                                    La búsqueda se hace por los valores de la columna indicada por el elemento "descripcion".
                                    Este método constituye una alternativa a abrir el listado y seleccionar un valor en éste, haciendo editable el campo de texto que contiene la descripción.
                                    Si texto-autocompletable/@demora=0, no se muestra una lista desplegable, sino que se completan los valores cuando el campo pierde el foco.
                                </xs:documentation>
                            </xs:annotation>
                        </xs:element>
                        <xs:element name="seleccionar-autocompletable" minOccurs="0">
                            <xs:annotation>
                                <xs:documentation>
                                    Indica que se debe proveer un campo de texto adicional para que el usuario pueda completar los valores del campo
                                    escribiendo directamente (parte de) un valor de la columna indicada por el elemento "seleccionar".
                                    Luego que el usuario haya tipeado al menos @long-min caracteres y tras una demora de @demora, se consulta dinámicamente al servidor
                                    y se le presenta una lista de valores que cumplan la condición @comparacion respecto al texto ingresado, en la cual puede seleccionar uno.
                                    Si seleccionar-autocompletable/@demora=0, no se muestra una lista desplegable, sino que se completan los valores cuando el campo pierde el foco.
                                </xs:documentation>
                            </xs:annotation>
                            <xs:complexType>
                                <xs:complexContent>
                                    <xs:extension base="campo-autocompletable">
                                        <xs:sequence>
                                            <xs:element ref="tip" minOccurs="0"/>
                                            <xs:element name="titulo-seleccionar" type="xs:normalizedString" minOccurs="0">
                                                <xs:annotation>
                                                    <xs:documentation>Etiqueta para el campo de texto que corresponde al valor a seleccionar.</xs:documentation>
                                                </xs:annotation>
                                            </xs:element>
                                            <xs:element name="titulo-descripcion" type="xs:normalizedString" minOccurs="0">
                                                <xs:annotation>
                                                    <xs:documentation>Etiqueta para el campo de texto que corresponde a la descripción.</xs:documentation>
                                                </xs:annotation>
                                            </xs:element>
                                        </xs:sequence>
                                        <xs:attribute name="ancho" type="xs:positiveInteger" default="10">
                                            <xs:annotation>
                                                <xs:documentation>Ancho, en cantidad de caracteres</xs:documentation>
                                            </xs:annotation>
                                        </xs:attribute>
                                        <xs:attribute name="ancho-maximo" type="xs:positiveInteger">
                                            <xs:annotation>
                                                <xs:documentation>Ancho máximo, en cantidad de caracteres</xs:documentation>
                                            </xs:annotation>
                                        </xs:attribute>
                                    </xs:extension>
                                </xs:complexContent>
                            </xs:complexType>
                        </xs:element>
                        <xs:element ref="condicion-campo-visible" minOccurs="0"/>
                    </xs:sequence>
                    <xs:attribute ref="requerido" use="optional"/>
                    <xs:attribute name="ancho" type="xs:positiveInteger">
                        <xs:annotation>
                            <xs:documentation>Ancho sugerido del campo de texto del seleccionable, en caracteres.</xs:documentation>
                        </xs:annotation>
                    </xs:attribute>
                    <xs:attribute name="ignorar-seleccionado" type="xs:boolean" default="false">
                        <xs:annotation>
                            <xs:documentation>
                                Indica que al abrir el listado de selección NO se debe filtrar por el valor actualmente seleccionado,
                                sino que se debe mostrar el listado completo.
                            </xs:documentation>
                        </xs:annotation>
                    </xs:attribute>
                    <xs:attribute name="solo-lectura" type="xs:boolean" default="false">
                        <xs:annotation>
                            <xs:documentation>
                                Permite indicar que el campo debe tener la edición deshabilitada.
                                En modo solo-lectura el campo no cuenta con el link para abrir el listado de selección.
                                A diferencia de @no_editable, este atributo se utiliza siempre, no sólo en edición.
                            </xs:documentation>
                        </xs:annotation>
                    </xs:attribute>
                </xs:complexType>
            </xs:element>
            <xs:element name="seleccionable-multiple">
                <xs:annotation>
                    <xs:documentation>
                        <![CDATA[
                        Define un campo que permite seleccionar múltiples valores a partir de un listado con la lista de valores posibles.
                        Dicho listado debe estar especificado en un archivo *_listado.xml y tener la salida seleccion_m habilitada
                        (/listado/generacion/salidas/seleccion_m).
                        ]]>
                    </xs:documentation>
                </xs:annotation>
                <xs:complexType>
                    <xs:sequence>
                        <xs:element ref="dato"/>
                        <xs:element ref="nombre" minOccurs="0"/>
                        <xs:element ref="titulo"/>
                        <xs:element ref="tip" minOccurs="0"/>
                        <xs:element ref="default" minOccurs="0"/>
                        <xs:element ref="preparar-valor" minOccurs="0"/>
                        <xs:element name="etiqueta" type="xs:normalizedString" minOccurs="0" default="Seleccionar">
                            <xs:annotation>
                                <xs:documentation>Texto del link que abre el listado de selección.</xs:documentation>
                            </xs:annotation>
                        </xs:element>
                        <xs:element name="tamanio" minOccurs="0" type="xs:normalizedString">
                            <xs:annotation>
                                <xs:documentation>
                                    Define el tamaño en que se abre el listado.
                                    El contenido debe estar en el formato aceptado por Configuracion::recuadroConMargen().
                                    El valor por defecto está dado por el parámetro de configuración tamanio_seleccionable_div.
                                </xs:documentation>
                            </xs:annotation>
                        </xs:element>
                        <xs:element name="entidad" type="entidad-seleccionable">
                            <xs:annotation>
                                <xs:documentation>Nombre de la entidad a la que corresponde el listado destino.</xs:documentation>
                            </xs:annotation>
                        </xs:element>
                        <xs:element name="tabla" type="xs:normalizedString" minOccurs="0">
                            <xs:annotation>
                                <xs:documentation>
                                    Nombre de la tabla que contiene el valor del campo.
                                    Si no está definido, se usa el elemento "entidad".
                                </xs:documentation>
                            </xs:annotation>
                        </xs:element>
                        <xs:element name="seleccionar" type="xs:normalizedString">
                            <xs:annotation>
                                <xs:documentation>Nombre de la columna del listado destino que contiene el valor que debe tomar el campo luego de realizar la selección.</xs:documentation>
                            </xs:annotation>
                        </xs:element>
                        <xs:element name="descripcion" type="xs:string" minOccurs="0">
                            <xs:annotation>
                                <xs:documentation>Nombre de la columna del listado destino que contiene el valor que debe mostrar el campo luego de realizar la selección (la descripción del valor seleccionado).</xs:documentation>
                            </xs:annotation>
                        </xs:element>
                        <xs:element name="orderby" type="xs:string" minOccurs="0">
                            <xs:annotation>
                                <xs:documentation>Valor para la cláusula ORDER BY de la consulta que selecciona los elementos.</xs:documentation>
                            </xs:annotation>
                        </xs:element>
                        <xs:element name="consulta-sm" type="consulta-seleccion-multiple">
                            <xs:annotation>
                                <xs:documentation>Define la consulta a realizar para obtener los elementos que deben estar seleccionados inicialmente.</xs:documentation>
                            </xs:annotation>
                        </xs:element>
                        <xs:element name="depende" type="seleccionable-depende" minOccurs="0">
                            <xs:annotation>
                                <xs:documentation>
                                    Define otros campos de cuyo valor dependen los valores disponibles para éste;
                                    por lo tanto, todos ellos deben tener valor antes de poder abrir este seleccionable.
                                    El valor de cada depende/campo se incluye en la cláusula WHERE del listado,
                                    al abrir el seleccionable.
                                </xs:documentation>
                            </xs:annotation>
                        </xs:element>
                        <xs:element ref="datos_adicionales" minOccurs="0"/>
                        <xs:element ref="condicion-campo-visible" minOccurs="0"/>
                    </xs:sequence>
                    <xs:attribute name="filas" type="xs:nonNegativeInteger" default="4">
                        <xs:annotation>
                            <xs:documentation>Indica la cantidad de filas con que se debe presentar el campo.</xs:documentation>
                        </xs:annotation>
                    </xs:attribute>
                    <xs:attribute name="CompletaCargaInicial" type="xs:normalizedString"/>
                    <xs:attribute name="solo-lectura" type="xs:boolean" default="false">
                        <xs:annotation>
                            <xs:documentation>
                                Permite indicar que el campo debe tener la edición deshabilitada.
                                En modo solo-lectura el campo no cuenta con el link para abrir el listado de selección.
                                A diferencia de @no_editable, este atributo se utiliza siempre, no sólo en edición.
                            </xs:documentation>
                        </xs:annotation>
                    </xs:attribute>
                </xs:complexType>
            </xs:element>
            <xs:element name="personalizado">
                <xs:annotation>
                    <xs:documentation>Tipo de campo con contenido definido por el usuario.</xs:documentation>
                </xs:annotation>
                <xs:complexType>
                    <xs:sequence>
                        <xs:element ref="dato" minOccurs="0">
                            <xs:annotation>
                                <xs:documentation>Si está presente, el valor queda disponible en la variable PHP $valores['{dato}'].</xs:documentation>
                            </xs:annotation>
                        </xs:element>
                        <xs:element ref="nombre" minOccurs="0"/>
                        <xs:element ref="titulo"/>
                        <xs:element ref="validacion" minOccurs="0">
                            <xs:annotation>
                                <xs:documentation>Sólo se tiene en cuenta este elemento si dato está especificado.</xs:documentation>
                            </xs:annotation>
                        </xs:element>
                        <xs:element ref="default" minOccurs="0">
                            <xs:annotation>
                                <xs:documentation>Sólo se tiene en cuenta este elemento si dato está especificado.</xs:documentation>
                            </xs:annotation>
                        </xs:element>
                        <xs:element ref="preparar-valor" minOccurs="0"/>
                        <xs:element name="contenido" type="xs:string">
                            <xs:annotation>
                                <xs:documentation>Código HTML para el contenido del campo.</xs:documentation>
                            </xs:annotation>
                        </xs:element>
                        <xs:element ref="condicion-campo-visible" minOccurs="0"/>
                    </xs:sequence>
                    <xs:attribute ref="requerido" use="optional"/>
                    <xs:attribute name="multilinea" type="xs:boolean" use="optional" default="false">
                      <xs:annotation>
                        <xs:documentation>Indica que el campo ocupa más de una línea.</xs:documentation>
                      </xs:annotation>
                    </xs:attribute>
                </xs:complexType>
            </xs:element>
        </xs:choice>
    </xs:group>

    <!-- Tipos, elementos y atributos comunes a varios tipos de campo -->

    <xs:simpleType name="orientacion">
        <xs:restriction base="xs:string">
            <xs:enumeration value="h">
                <xs:annotation>
                    <xs:documentation>Orientación horizontal</xs:documentation>
                </xs:annotation>
            </xs:enumeration>
            <xs:enumeration value="v">
                <xs:annotation>
                    <xs:documentation>Orientación vertical</xs:documentation>
                </xs:annotation>
            </xs:enumeration>
        </xs:restriction>
    </xs:simpleType>
    <xs:complexType name="lista-options">
        <xs:choice>
            <xs:sequence>
                <xs:annotation>
                    <xs:documentation>Define una lista de opciones estática en el XML.</xs:documentation>
                </xs:annotation>
                <xs:element name="option" maxOccurs="unbounded">
                    <xs:complexType>
                        <xs:simpleContent>
                            <xs:extension base="xs:normalizedString">
                                <xs:attribute name="value" type="xs:normalizedString" use="required"/>
                            </xs:extension>
                        </xs:simpleContent>
                    </xs:complexType>
                </xs:element>
            </xs:sequence>
            <xs:element name="options">
                <xs:annotation>
                    <xs:documentation>
                        <![CDATA[
                        Define la lista de opciones mediante código PHP.
                        Este elemento debe contener el cuerpo de una función que retorne un array conteniendo las opciones,
                        en el formato: array('value1' => 'label1', 'value2' => 'label2', ...).
                        Ejemplo: lista de números del 1 al 12, tanto para valores como para etiquetas
                        <options>
                        $a = range(1, 12);
                        return array_combine($a, $a);
                        </options>
                        ]]>
                    </xs:documentation>
                </xs:annotation>
            </xs:element>
        </xs:choice>
    </xs:complexType>
    <xs:complexType name="consulta" mixed="true">
        <xs:all>
            <xs:element name="tabla" type="xs:normalizedString" minOccurs="0">
                <xs:annotation>
                    <xs:documentation>
                        Indica la tabla destino de la consulta.
                        Debe estar presente si la consulta no es plana.
                    </xs:documentation>
                </xs:annotation>
            </xs:element>
            <xs:element name="valor" type="xs:normalizedString"  minOccurs="0">
                <xs:annotation>
                    <xs:documentation>
                        Columnas que tiene los valores.
                        Debe estar presente si la consulta no es plana.
                    </xs:documentation>
                </xs:annotation>
            </xs:element>
            <xs:element name="etiqueta" minOccurs="0">
                <xs:annotation>
                    <xs:documentation>
                        Columna que tiene las etiquetas.
                        Debe estar presente si la consulta no es plana.
                    </xs:documentation>
                </xs:annotation>
                <xs:complexType mixed="true">
                    <xs:all>
                        <xs:element name="expresion" type="xs:string" minOccurs="0">
                            <xs:annotation>
                                <xs:documentation>
                                    Define la etiqueta como una expresión SQL.
                                    Si está presente, también debe estar el elemento "rotulo".
                                </xs:documentation>
                            </xs:annotation>
                        </xs:element>
                        <xs:element name="rotulo" type="xs:string" minOccurs="0">
                            <xs:annotation>
                                <xs:documentation>
                                    Rotulo o alias a usar cuando la etiqueta se define como una expresión.
                                    No se tiene en cuenta si no está presente el elemento "expresion".
                                </xs:documentation>
                            </xs:annotation>
                        </xs:element>
                    </xs:all>
                </xs:complexType>
            </xs:element>
            <xs:element name="where" type="xs:string" minOccurs="0" />
            <xs:element name="orderby" type="xs:string" minOccurs="0" />
        </xs:all>
        <xs:attribute name="plana" type="xs:boolean">
            <xs:annotation>
                <xs:documentation>
                    Cuando este atributo está presente, la consulta se toma del contenido del elemento consulta,
                    ignorando el resto de los hijos.
                </xs:documentation>
            </xs:annotation>
        </xs:attribute>
    </xs:complexType>
    <xs:complexType name="consulta-seleccion-multiple">
        <xs:annotation>
            <xs:documentation>Consulta para un campo que permite selección múltiple de valores.</xs:documentation>
        </xs:annotation>
        <xs:choice>
            <xs:sequence>
                <xs:element name="tabla" type="xs:normalizedString" />
                <xs:element name="valor" type="xs:normalizedString" />
                <xs:element name="where" type="xs:string" minOccurs="0" />
            </xs:sequence>
            <xs:element name="plana">
                <xs:annotation>
                    <xs:documentation>
                        Cuando este atributo está presente, la consulta se toma del contenido del elemento,
                        ignorando el resto de los hijos.
                    </xs:documentation>
                </xs:annotation>
            </xs:element>
        </xs:choice>
        <xs:attribute name="realizar-en-alta" type="xs:boolean" default="false">
            <xs:annotation>
                <xs:documentation>
                    Permite indicar si la consulta se debe realizar sólo en el
                    formulario de modificación (false) o también en el de alta (true).
                </xs:documentation>
            </xs:annotation>
        </xs:attribute>
    </xs:complexType>
    <xs:complexType name="titulo-campo">
        <xs:simpleContent>
            <xs:extension base="xs:normalizedString"/>
        </xs:simpleContent>
    </xs:complexType>
    <xs:complexType name="titulo-campo-posicionado">
        <xs:simpleContent>
            <xs:extension base="titulo-campo">
                <xs:attribute name="posicion" default="izq">
                    <xs:annotation>
                        <xs:documentation>
                            Indica la posición del título respecto al control.
                            Sólo se tiene en cuenta para campos @tipo='CheckBox'.
                        </xs:documentation>
                    </xs:annotation>
                    <xs:simpleType>
                        <xs:restriction base="xs:string">
                            <xs:enumeration value="izq">
                                <xs:annotation>
                                    <xs:documentation>El título se ubica a la izquierda del control</xs:documentation>
                                </xs:annotation>
                            </xs:enumeration>
                            <xs:enumeration value="der">
                                <xs:annotation>
                                    <xs:documentation>El título se ubica a la derecha del control</xs:documentation>
                                </xs:annotation>
                            </xs:enumeration>
                        </xs:restriction>
                    </xs:simpleType>
                </xs:attribute>
            </xs:extension>
        </xs:simpleContent>
    </xs:complexType>
    <xs:complexType name="entidad-seleccionable">
        <xs:annotation>
            <xs:documentation>Entidad a la que corresponde el listado destino de un seleccionable. El contenido del elemento define el nombre de la entidad.</xs:documentation>
        </xs:annotation>
        <xs:simpleContent>
            <xs:extension base="xs:normalizedString">
                <xs:attribute name="procesar-xinclude" type="xs:boolean" default="false">
                    <xs:annotation>
                        <xs:documentation>
                            <![CDATA[
                            ¿Se debe aplicar procesamiento de XInclude cuando se carga la definición del listado destino?
                            El valor predeterminado de este atributo es false para mantener compatibilidad con versiones anteriores.
                            ]]>
                        </xs:documentation>
                    </xs:annotation>
                </xs:attribute>
            </xs:extension>
        </xs:simpleContent>
    </xs:complexType>
    <xs:complexType name="seleccionable-depende">
        <xs:sequence>
            <xs:element name="campo" minOccurs="1" maxOccurs="unbounded">
                <xs:annotation>
                    <xs:documentation>Nombre de un campo del que depende la consulta.</xs:documentation>
                </xs:annotation>
                <xs:complexType>
                    <xs:simpleContent>
                        <xs:extension base="xs:normalizedString">
                            <xs:attribute name="referencia" type="xs:normalizedString">
                                <xs:annotation>
                                    <xs:documentation>
                                        Indica el nombre de la columna referenciada en la tabla destino.
                                        Si no está presente, se usa como nombre de columna el mismo valor de este elemento.
                                    </xs:documentation>
                                </xs:annotation>
                            </xs:attribute>
                        </xs:extension>
                    </xs:simpleContent>
                </xs:complexType>
            </xs:element>
        </xs:sequence>
    </xs:complexType>
    <xs:complexType name="campo-autocompletable">
        <xs:sequence>
            <xs:element name="columnas-extra-mostrar" minOccurs="0">
                <xs:annotation>
                    <xs:documentation>Permite definir una lista de columnas a mostrar cuando se despliega el campo, además de las predefinidas.</xs:documentation>
                </xs:annotation>
                <xs:complexType>
                    <xs:sequence>
                        <xs:element name="columna" type="normalizedStringNotEmpty" maxOccurs="unbounded">
                            <xs:annotation>
                                <xs:documentation>Nombre de una columna extra a mostrar.</xs:documentation>
                            </xs:annotation>
                        </xs:element>
                    </xs:sequence>
                </xs:complexType>
            </xs:element>
        </xs:sequence>
        <xs:attribute name="comparacion" type="operador-inclusion-listas" default="sw">
            <xs:annotation>
                <xs:documentation>Operador a usar para comparar el texto ingresado con el valor de la columna.</xs:documentation>
            </xs:annotation>
        </xs:attribute>
        <xs:attribute name="ignorar-acentos" type="xs:boolean" default="true">
            <xs:annotation>
                <xs:documentation>¿Se deben ignorar los acentos, tanto en el texto ingresado como en los valores de la columna?</xs:documentation>
            </xs:annotation>
        </xs:attribute>
        <xs:attribute name="demora" type="xs:nonNegativeInteger" default="300">
            <xs:annotation>
                <xs:documentation>
                    <![CDATA[
                    Tiempo en milisegundos que se debe esperar para realizar la consulta, luego que el usuario tipea un caracter.
                    El valor 0 indica que sólo se debe hacer luego que el campo pierde el foco.
                    ]]>
                </xs:documentation>
            </xs:annotation>
        </xs:attribute>
        <xs:attribute name="long-min" type="xs:nonNegativeInteger" default="4">
            <xs:annotation>
                <xs:documentation>
                    <![CDATA[
                    Longitud mínima del texto en el campo, antes que se active el autocompletado.
                    Sólo se tiene en cuenta si @demora > 0.
                    ]]>
                </xs:documentation>
            </xs:annotation>
        </xs:attribute>
        <xs:attribute name="tam-pagina" type="xs:positiveInteger" default="10">
            <xs:annotation>
                <xs:documentation>Cantidad de valores que se muestran en cada página de la lista desplegable.</xs:documentation>
            </xs:annotation>
        </xs:attribute>
        <xs:attribute name="ancho-lista" type="xs:normalizedString">
            <xs:annotation>
                <xs:documentation>Ancho de la lista desplegable. Ejemplos: 100 (se asume px); 100px; 15em.</xs:documentation>
            </xs:annotation>
        </xs:attribute>
    </xs:complexType>
    <xs:simpleType name="operador-inclusion-listas">
        <xs:annotation>
            <xs:documentation>
                <![CDATA[
                Posibles operadores para comparar la inclusión de una lista de valores en otra.
                Una lista de valores es cualquier valor formado por una lista ordenada de otros valores,
                por ejemplo una cadena de caracteres.
                ]]>
            </xs:documentation>
        </xs:annotation>
        <xs:restriction base="xs:string">
            <xs:enumeration value="sw">
                <xs:annotation>
                    <xs:documentation>¿La lista 1 tiene como prefijo a la lista 2?</xs:documentation>
                </xs:annotation>
            </xs:enumeration>
            <xs:enumeration value="ew">
                <xs:annotation>
                    <xs:documentation>¿La lista 1 tiene como sufijo a la lista 2?</xs:documentation>
                </xs:annotation>
            </xs:enumeration>
            <xs:enumeration value="cont">
                <xs:annotation>
                    <xs:documentation>¿La lista 1 contiene a la lista 2, en alguna posición?</xs:documentation>
                </xs:annotation>
            </xs:enumeration>
            <xs:enumeration value="eq">
                <xs:annotation>
                    <xs:documentation>¿La lista 1 y la 2 son iguales?</xs:documentation>
                </xs:annotation>
            </xs:enumeration>
            <xs:enumeration value="nsw">
                <xs:annotation>
                    <xs:documentation>¿La lista 1 no tiene como prefijo a la lista 2?</xs:documentation>
                </xs:annotation>
            </xs:enumeration>
            <xs:enumeration value="new">
                <xs:annotation>
                    <xs:documentation>¿La lista 1 no tiene como sufijo a la lista 2?</xs:documentation>
                </xs:annotation>
            </xs:enumeration>
            <xs:enumeration value="ncont">
                <xs:annotation>
                    <xs:documentation>¿La lista 1 no contiene a la lista 2, en ninguna posición?</xs:documentation>
                </xs:annotation>
            </xs:enumeration>
            <xs:enumeration value="neq">
                <xs:annotation>
                    <xs:documentation>¿La lista 1 y la 2 no son iguales?</xs:documentation>
                </xs:annotation>
            </xs:enumeration>
        </xs:restriction>
    </xs:simpleType>
    <xs:simpleType name="operador-comparacion-listas">
        <xs:annotation>
            <xs:documentation>
                Posibles operadores para comparar dos listas de valores.
                Una lista de valores es cualquier valor formado por una lista ordenada de otros valores,
                por ejemplo una cadena de caracteres.
            </xs:documentation>
        </xs:annotation>
        <xs:union memberTypes="operador-inclusion-listas">
            <xs:simpleType>
                <xs:restriction base="xs:string">
                    <xs:enumeration value="lt">
                        <xs:annotation>
                            <xs:documentation>¿La lista 1 es menor que la 2?</xs:documentation>
                        </xs:annotation>
                    </xs:enumeration>
                    <xs:enumeration value="lte">
                        <xs:annotation>
                            <xs:documentation>¿La lista 1 es menor o igual que la 2?</xs:documentation>
                        </xs:annotation>
                    </xs:enumeration>
                    <xs:enumeration value="gt">
                        <xs:annotation>
                            <xs:documentation>¿La lista 1 es mayor que la 2?</xs:documentation>
                        </xs:annotation>
                    </xs:enumeration>
                    <xs:enumeration value="gte">
                        <xs:annotation>
                            <xs:documentation>¿La lista 1 es mayor o igual que la 2?</xs:documentation>
                        </xs:annotation>
                    </xs:enumeration>
                </xs:restriction>
            </xs:simpleType>
        </xs:union>
    </xs:simpleType>
    <xs:element name="dato" type="xs:normalizedString">
        <xs:annotation>
            <xs:documentation>Nombre del origen de datos del campo.</xs:documentation>
        </xs:annotation>
    </xs:element>
    <xs:element name="nombre" type="xs:ID">
        <xs:annotation>
            <xs:documentation>
                Nombre (id) a usar para el campo de formulario.
                Si no se especifica, se usa el valor de dato.
            </xs:documentation>
        </xs:annotation>
    </xs:element>
    <xs:element name="valor" type="xs:normalizedString"/>
    <xs:element name="titulo" type="titulo-campo">
        <xs:annotation>
            <xs:documentation>Titulo a mostrar para el campo</xs:documentation>
        </xs:annotation>
    </xs:element>
    <xs:element name="tip" type="xs:string">
        <xs:annotation>
            <xs:documentation>Texto para el tooltip del campo.</xs:documentation>
        </xs:annotation>
    </xs:element>
    <xs:element name="validacion" type="xs:normalizedString" />
    <xs:element name="default" type="xs:normalizedString">
        <xs:annotation>
            <xs:documentation>
                <![CDATA[
                Valor a usar por defecto para el campo.
                Debe ser una expresión PHP. Por ejemplo:
                <default>5</default>, <default>'abc'</default>, <default>__FILE__</default>, <default>phpversion()</default>
                Si no está presente, se usa el valor por defecto definido para la columna correspondiente en la base de datos.
                ]]>
            </xs:documentation>
        </xs:annotation>
    </xs:element>
    <xs:element name="preparar-valor" type="xs:string">
        <xs:annotation>
            <xs:documentation>
                Permite modificar el valor inicial del campo.
                Se aplica *antes* de cargarlo desde la base de datos, por lo cual se puede utilizar para
                cambiar lo que se recibe via request antes de realizar la acción del formulario,
                pero no para variar lo que aparece en el campo cuando se presenta la página.
                El contenido debe ser código PHP que retorne el nuevo valor. Dentro de este código
                están predefinidas las variables:
                * string $valor: valor original
                * boolean $agregado: ¿es un formulario de alta?
                * string $accion: nombre de la acción a ejecutar
                * Conexion $conexion
                * iSeguridad $seguridad
                * Configuracion $configuracion
                * HistorialNavegacion $historial
            </xs:documentation>
        </xs:annotation>
    </xs:element>
    <xs:element name="codigo-seleccion-inicial">
        <xs:annotation>
            <xs:documentation>
                <![CDATA[
                Código de una función PHP que determina los elementos que deben estar inicialmente seleccionados.
                Debe retornar un array con los valores a seleccionar, los cuales deben pertenecer al conjunto total de valores del campo.
                Recibe los siguientes parámetros:
                 * array $valores valores iniciales de todos los campos
                 * boolean $agregado
                 * Conexion $conexion
                 * iSeguridad $seguridad
                 * Configuracion $configuracion
                 * HistorialNavegacion $historial
                ]]>
            </xs:documentation>
        </xs:annotation>
    </xs:element>
    <xs:element name="controles-seleccion-lista">
        <xs:annotation>
            <xs:documentation>Si está presente, se agregan controles para cambiar la selección de los elementos de la lista.</xs:documentation>
        </xs:annotation>
        <xs:complexType>
            <xs:sequence>
                <xs:element name="todos" minOccurs="0">
                    <xs:annotation>
                        <xs:documentation>Opciones para el control "Mostrar todos"</xs:documentation>
                    </xs:annotation>
                    <xs:complexType>
                        <xs:attribute name="generar" type="xs:boolean" default="true">
                            <xs:annotation>
                                <xs:documentation>¿Se debe generar este control?</xs:documentation>
                            </xs:annotation>
                        </xs:attribute>
                        <xs:attribute name="etiqueta" type="xs:normalizedString" default="T">
                            <xs:annotation>
                                <xs:documentation>Texto a mostrar</xs:documentation>
                            </xs:annotation>
                        </xs:attribute>
                        <xs:attribute name="tip" type="xs:normalizedString" default="Seleccionar todo">
                            <xs:annotation>
                                <xs:documentation>Tooltip</xs:documentation>
                            </xs:annotation>
                        </xs:attribute>
                    </xs:complexType>
                </xs:element>
                <xs:element name="ninguno" minOccurs="0">
                    <xs:annotation>
                        <xs:documentation>Opciones para el control "Deseleccionar todos"</xs:documentation>
                    </xs:annotation>
                    <xs:complexType>
                        <xs:attribute name="generar" type="xs:boolean" default="true">
                            <xs:annotation>
                                <xs:documentation>¿Se debe generar este control?</xs:documentation>
                            </xs:annotation>
                        </xs:attribute>
                        <xs:attribute name="etiqueta" type="xs:normalizedString" default="N">
                            <xs:annotation>
                                <xs:documentation>Texto a mostrar</xs:documentation>
                            </xs:annotation>
                        </xs:attribute>
                        <xs:attribute name="tip" type="xs:normalizedString" default="Deseleccionar todo">
                            <xs:annotation>
                                <xs:documentation>Tooltip</xs:documentation>
                            </xs:annotation>
                        </xs:attribute>
                    </xs:complexType>
                </xs:element>
                <xs:element name="restaurar" minOccurs="0">
                    <xs:annotation>
                        <xs:documentation>Opciones para el control "Restaurar selección"</xs:documentation>
                    </xs:annotation>
                    <xs:complexType>
                        <xs:attribute name="generar" type="xs:boolean" default="true">
                            <xs:annotation>
                                <xs:documentation>¿Se debe generar este control?</xs:documentation>
                            </xs:annotation>
                        </xs:attribute>
                        <xs:attribute name="etiqueta" type="xs:normalizedString" default="R">
                            <xs:annotation>
                                <xs:documentation>Texto a mostrar</xs:documentation>
                            </xs:annotation>
                        </xs:attribute>
                        <xs:attribute name="tip" type="xs:normalizedString" default="Volver a la selección inicial">
                            <xs:annotation>
                                <xs:documentation>Tooltip</xs:documentation>
                            </xs:annotation>
                        </xs:attribute>
                    </xs:complexType>
                </xs:element>
            </xs:sequence>
        </xs:complexType>
    </xs:element>
    <xs:element name="datos_adicionales">
        <xs:annotation>
            <xs:documentation>
                Permite obtener valores de columnas adicionales para la fila que se selecciona en el listado
                y guardarlos en otros campos del formulario; de esta forma, con una sola selección se actualizan
                varios campos (éste y cada datos_adicionales/correspondencia/@origen).
            </xs:documentation>
        </xs:annotation>
        <xs:complexType>
            <xs:sequence>
                <xs:element name="correspondencia" maxOccurs="unbounded">
                    <xs:annotation>
                        <xs:documentation>
                            Define un valor extra a obtener, mediante una correspondencia entre el campo origen y la columna de la tabla destino.
                        </xs:documentation>
                    </xs:annotation>
                    <xs:complexType>
                        <xs:attribute name="origen" use="required">
                            <xs:annotation>
                                <xs:documentation>
                                    Nombre de otro campo definido en el formulario, que va a recibir el valor de la columna @destino cuando se haga una selección.
                                </xs:documentation>
                            </xs:annotation>
                        </xs:attribute>
                        <xs:attribute name="destino" use="required">
                            <xs:annotation>
                                <xs:documentation>
                                    Nombre de la columna en el listado seleccionable, de la cual se debe obtener el valor para colocar en el campo @origen.
                                </xs:documentation>
                            </xs:annotation>
                        </xs:attribute>
                        <xs:attribute name="va_a_cond_seleccion" type="xs:boolean" default="true">
                            <xs:annotation>
                                <xs:documentation>Indica si esta correspondencia debe formar parte de la condición de selección.</xs:documentation>
                            </xs:annotation>
                        </xs:attribute>
                    </xs:complexType>
                </xs:element>
            </xs:sequence>
        </xs:complexType>
    </xs:element>
    <xs:element name="condicion-campo-visible">
        <xs:annotation>
            <xs:documentation>
                <![CDATA[
                Permite especificar una condición para determinar en tiempo de ejecución si el campo se debe mostrar o no.
                ]]>
            </xs:documentation>
        </xs:annotation>
        <xs:complexType>
            <xs:sequence>
                <xs:element name="codigo" type="stringNotEmpty">
                    <xs:annotation>
                        <xs:documentation>
                            <![CDATA[
                            Código de una función PHP que indica si el campo se debe mostrar o no.
                            El valor de retorno se evalúa como booleano. Si es true, se muestra; si es false, no.
                            Recibe los parámetros:
                            - Conexion $conexion
                            - iSeguridad $seguridad
                            - HistorialNavegacion $historial
                            - Configuracion $configuracion
                            - boolean $agregado
                            ]]>
                        </xs:documentation>
                    </xs:annotation>
                </xs:element>
                <xs:element name="valor-no-visible" minOccurs="0">
                    <xs:annotation>
                        <xs:documentation>
                            <![CDATA[
                            Indica el valor que toma el campo cuando no es visible.
                            Si no está presente, se asume que se usa valor-no-visible/default.
                            ]]>
                        </xs:documentation>
                    </xs:annotation>
                    <xs:complexType>
                        <xs:choice>
                            <xs:element name="excluir" type="empty">
                                <xs:annotation>
                                    <xs:documentation>
                                        <![CDATA[Indica que el campo se debe excluir del formulario, es decir que no genera un hidden ni se incluye en el registro.]]>
                                    </xs:documentation>
                                </xs:annotation>
                            </xs:element>
                            <xs:element name="default" type="empty">
                                <xs:annotation>
                                    <xs:documentation>
                                        <![CDATA[Usa el valor por defecto del campo, con lo cual se comporta como si fuera de tipo Oculto.]]>
                                    </xs:documentation>
                                </xs:annotation>
                            </xs:element>
                            <xs:element name="sesion" type="xs:normalizedString">
                                <xs:annotation>
                                    <xs:documentation>
                                        <![CDATA[
                                        Usa el valor de una variable de sesión.
                                        El contenido de este elemento indica el nombre de la variable de sesión a obtener.
                                        ]]>
                                    </xs:documentation>
                                </xs:annotation>
                            </xs:element>
                            <xs:element name="expresion" type="normalizedStringNotEmpty">
                                <xs:annotation>
                                    <xs:documentation>
                                        <![CDATA[Usa el valor de retorno de una expresión PHP.]]>
                                    </xs:documentation>
                                </xs:annotation>
                            </xs:element>
                            <xs:element name="codigo" type="stringNotEmpty">
                                <xs:annotation>
                                    <xs:documentation>
                                        <![CDATA[
                                        Usa el valor de retorno de un bloque de código PHP.
                                        El contenido de este elemento debe ser el cuerpo de una función que retorne el valor;
                                        dentro se pueden usar las variables:
                                        - Conexion $conexion
                                        - iSeguridad $seguridad
                                        - HistorialNavegacion $historial
                                        - Configuracion $configuracion
                                        - ADORecordSet $recordset (contiene el registro del formulario si $agregado es false; es null si $agregado es true)
                                        - boolean $agregado
                                        ]]>
                                    </xs:documentation>
                                </xs:annotation>
                            </xs:element>
                        </xs:choice>
                    </xs:complexType>
                </xs:element>
            </xs:sequence>
        </xs:complexType>
    </xs:element>
    <xs:attribute name="no_editable" type="xs:boolean" default="false">
        <xs:annotation>
            <xs:documentation>Si este atributo tiene valor verdadero, indica que el campo no se puede modificar cuando el formulario se presenta para edición.</xs:documentation>
        </xs:annotation>
    </xs:attribute>
    <xs:attribute name="solo-lectura" type="xs:boolean">
        <xs:annotation>
            <xs:documentation>Si este atributo tiene valor verdadero, indica que el campo no se puede modificar en ningún caso.</xs:documentation>
        </xs:annotation>
    </xs:attribute>
    <xs:attribute name="requerido" type="xs:boolean">
        <xs:annotation>
            <xs:documentation>Indica si el campo es requerido, ignorando cómo está definido en la base de datos.</xs:documentation>
        </xs:annotation>
    </xs:attribute>
    <xs:attribute name="multilinea" type="xs:boolean"/>
</xs:schema>
