Al diseñar una interfaz XForm para una base de datos XML (utilizando eXist y XSLTForms), me gustaría incluir un control de entrada para un elemento opcional. Los registros de datos XML ya existen y mientras que algunos contienen el elemento opcional, otros no. Para actualizar un registro, estoy usando el registro XML existente como la instancia del modelo. El problema es que el control de formulario no se muestra cuando el elemento opcional no está presente, lo cual es lógico, pero presenta un problema cuando un usuario desea agregar datos al elemento opcional.Permitir controles XForm para elementos XML opcionales
Para ser más explícitos, he aquí un ejemplo de registro de datos, data.xml:
<a>
<b>content</b>
</a>
con esquema RNC:
start =
element a {
element b { text },
element notes { text }?
}
XForms modelo:
<xf:model>
<xf:instance xmlns="" src="data.xml"/>
<xf:submission id="save" method="post" action="update.xq" />
</xf:model>
y control:
<xf:input ref="https://stackoverflow.com/a/notes">
<xf:label>Notes (optional): </xf:label>
</xf:input>
El problema es que el control de entrada 'Notas' simplemente no se muestra.
Una solución obvia es agregar un botón de activación para permitirle al usuario insertar el elemento si es necesario, pero es preferible que solo aparezca el control de entrada y que esté vacío.
Mi pregunta es: ¿Existe alguna combinación sutil de atributos/binds/multiple instances/expresiones xpath menos conocidas que harán que siempre se muestre el control?
Gracias por esta sugerencia. Desde entonces, descubrí que agregar _nuevos elementos con una inserción no es fácil. – Cam
Sí, el 'xforms: insert' es una construcción bastante complicada, especialmente debido a todos los atributos que puede usar en ese elemento. Pero hay dos o tres casos de uso principales para cada uno, cada uno de los cuales requiere diferentes atributos, y una vez que entiendes esas cosas se vuelven más simples. Puede encontrar un tipo de tutorial para 'xforms: insert' en: http://wiki.orbeon.com/forms/how-to/repeat-insert-position – avernet