2010-05-25 7 views
5

Me disculpo de antemano si no estoy pidiendo esto correctamente .. es difícil de poner en palabras lo que estoy pidiendo ..XForms y múltiples entradas para la etiqueta mismo modelo

Tengo modelo XForms tales como:

<file> 
    <criteria> 
     <criterion></criterion> 
    </criteria> 
</file> 

Quiero tener varios cuadros de texto de entrada que crean una nueva etiqueta de criterio.

interfaz de usuario, tales como:

<xf:input ref="/file/criteria/criterion" model="select_data"> 
    <xf:label>Select</xf:label> 
</xf:input> 

<xf:input ref="/file/criteria/criterion" model="select_data"> 
    <xf:label>Select</xf:label> 
</xf:input> 

<xf:input ref="/file/criteria/criterion" model="select_data"> 
    <xf:label>Select</xf:label> 
</xf:input> 

Y me gustaría que la salida XML a tener este aspecto (una vez que el usuario ha entrado en información):

<file> 
    <criteria> 
     <criterion>AAA</criterion> 
     <criterion>BBB</criterion> 
     <criterion>CCC</criterion> 
    </criteria> 
</file> 

La manera que tengo que doesn' t funciona, ya que los 3 campos de entrada se refieren a la misma etiqueta de criterio. ¿Cómo me diferencio?

Gracias! ¡Espero que tenga algún sentido!

empezar Primeros EDITAR

Gracias por las respuestas para el cuadro de texto básico!

Sin embargo, ahora necesito hacer esto con un cuadro de lista. Pero por mi vida, no puedo entender cómo. Leí en alguna parte para usar con las formas: seleccionar y anular la selección de eventos ... pero no sabía dónde colocarlos, y los lugares que probé me dieron un comportamiento muy extraño.

actualmente estoy poniendo en práctica lo siguiente:

<xf:select ref="instance('criteria_data')/criteria/criterion" selection="" appearance="compact" > 
     <xf:label>Choose criteria</xf:label> 
     <xf:itemset nodeset="instance('criteria_choices')/choice"> 
      <xf:label ref="@label"></xf:label> 
      <xf:value ref="."></xf:value> 
     </xf:itemset> 
    </xf:select> 

Sin embargo, cuando se presentan varias opciones, todos los valores de selección se insertan en el mismo nodo, separados por espacios.

Por ejemplo:

Si se seleccionaron AAA y BBB y FFF del cuadro de lista, que daría lugar a la siguiente XML:

<criterion>AAA BBB FFF</criterion> 

¿Cómo cambiar el código para que cada selección sea en una nodo separado?

decir que quiere que se vea como esto:

<criterion>AAA</criterion> 
<criterion>BBB</criterion> 
<criterion>FFF</criterion> 

Gracias!

primer extremo EDITAR

COMENZAR SEGUNDO EDIT:

Para los cuadros de lista (es decir, xf: seleccione apariencia = "compacto") Terminé permitiendo que los espacios que se producen en el mismo nodo y luego simplemente transformó ese xml usando xsl para generar un nuevo documento XML correctamente formateado (con nodos individuales separados). Desafortunadamente, no encontré una solución menos engorrosa al insertarlos originalmente en nodos separados.

La respuesta seleccionada funciona muy bien para los cuadros de texto, de ahí que la haya seleccionado como respuesta.

FIN SEGUNDA EDICIÓN

Respuesta

2

Si tres criterios son suficientes para usted, entonces usted debe utilizar el índice entre paréntesis:

<xf:input ref="/file/criteria/criterion[1]" model="select_data"> 
    <xf:label>Select</xf:label> 
</xf:input> 

<xf:input ref="/file/criteria/criterion[2]" model="select_data"> 
    <xf:label>Select</xf:label> 
</xf:input> 

<xf:input ref="/file/criteria/criterion[3]" model="select_data"> 
    <xf:label>Select</xf:label> 
</xf:input> 

Pero si utiliza XF: repetir su lugar, puede añadir tantos criterios que necesita:

<xf:group ref="/file/criteria" mode="select_data"> 
    <xf:repeat nodeset="criterion"> 
     <xf:input ref="."> 
      <xf:label>Select</xf:label> 
     </xf:input> 
    </xf:repeat> 
    <xf:trigger> 
     <xf:label>Insert new row</xf:label> 
     <xf:insert nodeset="criterion" position="after" at="last()" ev:event="DOMActivate"/> 
    </xf:trigger> 
    <xf:trigger> 
     <xf:label>Delete last row</xf:label> 
     <xf:delete nodeset="criterion" at="last()" ev:event="DOMActivate" /> 
    </xf:trigger> 
</xf:group> 

Cuidado: este ejemplo con repetición necesita un poco de pulido, por lo que no puede eliminar la última fila en tabla, y posiblemente ocultar la última fila, que se duplica cuando inserta una nueva. Ver http://en.wikibooks.org/wiki/XForms#Tabular_and_Repeating_Data para ejemplos adicionales.

+0

Gracias! Esto funciona muy bien con mis cuadros de texto. Supongo que puedo hacer algo similar con un cuadro combinado entonces? (es decir, seleccionar varias cosas de un cuadro combinado y convertirlas en un nuevo criterio). – developer

+0

@iHeartGreek, sí exactamente. Puedes tener todo lo que quieras dentro de ''. – avernet

+0

Intenté esta solución trabajando con el listbox (usando xforms: select) pero no puedo resolverlo. También leí que debería usar las xforms: seleccionar y anular la selección de eventos, pero obtuve un comportamiento extraño con eso. (Consulte mi edición anterior para obtener más información sobre mi nuevo problema) – developer

Cuestiones relacionadas