2010-05-25 5 views
5

Я прошу прощения заранее, если я не прошу это правильно .. это трудно выразить словами то, что я прошу ..XForms и несколько входов для той же модели тега

У меня есть XForms модели, такие как:

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

Я хочу иметь несколько текстовых полей ввода, которые создают новый тег критерия.

пользовательский интерфейс, такие как:

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

И я хотел бы вывод XML, чтобы выглядеть следующим образом (когда пользователь вошел в информации):

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

так, как я это Безразлично» t, поскольку он видит, что 3 поля ввода будут ссылаться на все те же теги критерия. Как я различаю?

Спасибо! Надеюсь, это имело какой-то смысл!

НАЧАТЬ первое редактирование

Спасибо за ответы на основное текстовом поле!

Однако теперь мне нужно сделать это со списком. Но для моей жизни я не могу понять, как это сделать. Я читал где-то использовать с xforms: выбирать и отменять события. Но я не знал, где их разместить, и места, которые я пробовал, дали мне очень странное поведение.

Я в настоящее время осуществляет следующие действия:

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

Однако, когда несколько вариантов представлены все значения выбора вставляются в тот же узел, разделенные пробелами.

Например:

Если AAA и BBB и FFF были выбраны из списка, это привело бы к следующему XML:

<criterion>AAA BBB FFF</criterion> 

Как изменить свой код, чтобы каждый выбор будет в отдельный узел?

то я хочу, чтобы выглядеть следующим образом:

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

Спасибо!

КОНЕЦ ПЕРВОГО РЕДАКТИРОВАТЬ

НАЧАТЬ ВТОРОЙ EDIT:

для ListBoxes (т.е. XF: выбрать внешний вид = "компактные") я в конечном итоге позволяя пространства происходить в том же самом узле а затем просто преобразовал этот xml с помощью xsl для создания правильно отформатированного нового XML-документа (с отдельными отдельными узлами). К сожалению, я не нашел менее громоздкого решения, вставив их изначально в отдельные узлы.

Выбранный ответ очень хорошо подходит для текстовых полей, поэтому я выбрал его как ответ.

КОНЕЦ ВТОРОЙ EDIT

ответ

2

Если три Учитывается достаточно для вас, то вы должны использовать индекс в скобках:

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

Но если вы используете XF: повторять вместо этого, вы можете добавить столько, сколько критерии вам нужно:

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

Осторожно: этот пример с повтором необходим полировку, так что вы не можете удалить последнюю строку таблицу и, возможно, скрыть последнюю строку, которая дублируется при вставке нового. Дополнительную информацию см. В разделе http://en.wikibooks.org/wiki/XForms#Tabular_and_Repeating_Data.

+0

Спасибо! Это очень хорошо работает с моими текстовыми полями. Я предполагаю, что я могу сделать что-то подобное с полем со списком? (т. е. выбрать несколько элементов из комбинированного блока и сделать их новым критерием). – developer

+0

@iHeartGreek, да точно. Внутри '' вы можете иметь все, что угодно. – avernet

+0

Я пробовал это решение, работая со списком (используя xforms: select), но я не могу понять это. Я также читал, что должен использовать xforms: выбирать и отменить выбор событий, но я просто получил странное поведение с этим. (См. Мое редактирование выше для большего контекста моей новой проблемы) – developer

Смежные вопросы