2010-05-25 15 views
5

mi scuso in anticipo se io non chiedo questo correttamente .. è difficile esprimere a parole quello che sto chiedendo ..XForms e gli ingressi multipli per etichetta stesso modello

ho XForms modello come:

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

Desidero avere più caselle di testo di input che creino un nuovo criterio.

interfaccia utente come ad esempio:

<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> 

E vorrei l'output XML per assomigliare a questo (una volta che l'utente ha inserito nelle informazioni):

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

Il modo in cui l'ho doesn' funziona, visto che i 3 campi di input si riferiscono tutti allo stesso criterio. Come faccio a differenziare?

Grazie! Spero che abbia un senso!

iniziare Innanzitutto EDIT

Grazie per le risposte per la casella di testo di base!

Tuttavia, ora ho bisogno di farlo con una lista. Ma per la vita di me, non riesco a capire come. Ho letto da qualche parte per usare le xforms: selezionare e deselezionare gli eventi .. ma non sapevo dove metterli, e i posti che ho provato mi davano un comportamento molto strano.

Sono attualmente attuando le seguenti:

<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> 

Tuttavia quando vengono inserite più scelte, tutti i valori di selezione sono inseriti nello stesso nodo, separati da spazi.

Ad esempio:

Se AAA e BBB e FFF sono stati selezionati dalla casella di riepilogo, che comporterebbe il seguente codice XML:

<criterion>AAA BBB FFF</criterion> 

Come faccio a cambiare il mio codice per avere ogni selezione sia in una nodo separato?

cioè voglio farlo sembrare come questo:

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

Grazie!

prima estremità EDIT

BEGIN SECONDO EDIT:

Ai listboxes (cioè xf: select aspetto = "compatto") ho finito permettendo gli spazi a verificarsi nello stesso nodo e poi ha appena trasformato quel xml usando xsl per generare un nuovo documento xml correttamente formattato (con singoli nodi separati). Sfortunatamente, non ho trovato una soluzione meno ingombrante inserendoli originariamente in nodi separati.

La risposta selezionata funziona molto bene per le caselle di testo, quindi, perché l'ho selezionata come risposta.

FINE SECONDO EDIT

risposta

2

Se tre criteri sono abbastanza per voi, allora dovreste usare indice in parentesi:

<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> 

Ma se si utilizza XF: ripetere, invece, è possibile aggiungere il numero criteri necessari:

<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> 

Attenzione: questo esempio con ripetizione necessita di un po 'di lucidatura, in modo che non è possibile eliminare l'ultima riga in tabella, e possibilmente nascondere l'ultima riga, che viene duplicata quando si inserisce un nuovo. Vedi http://en.wikibooks.org/wiki/XForms#Tabular_and_Repeating_Data per ulteriori esempi.

+0

Grazie! Funziona molto bene con le mie caselle di testo. Suppongo che io possa fare qualcosa di simile con una scatola combinata, allora? (ad esempio, seleziona più oggetti da una casella combinata e rendili in un nuovo criterio). – developer

+0

@iHeartGreek, sì esattamente. Puoi avere tutto ciò che vuoi all'interno di < '. – avernet

+0

Ho provato questa soluzione lavorando con la listbox (usando xforms: select) ma non riesco a capirlo. Ho anche letto che dovrei usare xforms: selezionare e deselezionare gli eventi ma ho appena ottenuto un comportamento strano con quello. (Vedi la mia modifica sopra per più contesto del mio nuovo problema) – developer

Problemi correlati