XForms: как привязать значение к атрибуту

Я работаю над дизайном формы XForm. Моя текущая форма выглядит примерно так:

  <xforms:model>
    <xforms:instance id="PhoneCallsSimple2" xmlns="">
      <request>
        <criterias relation="AND">
            <criterias relation="OR">
                <criteria name="CritCallStartDateLower" operator="GreaterOrEqual" model="CallStartDate" gui_display="From date"/>
                <criteria name="CritCallStartDateUpper" operator="LessOrEqual" model="CallStartDate" gui_display="To date"/>
            </criterias>
            <criteria name="CritCallCustomerID" operator="Equal" model="CustomerID" gui_display="Customer ID"/>
            <criteria name="CritCallCustomerLastName" operator="BeginWith" model="CustomerLastName" gui_display="Customer LastName"/>
        </criterias>
      </request>
    </xforms:instance>
    <xforms:bind id="bindCallStartDateLower" required="true()" type="xforms:date" nodeset="/request/criterias/criterias/criteria[@name='CritCallStartDateLower']"/>
    <xforms:bind id="bindCallStartDateUpper" required="true()" type="xforms:date" nodeset="/request/criterias/criterias/criteria[@name='CritCallStartDateUpper']" constraint="(days-from-date(.) &gt;= days-from-date(/request/criterias/criterias/criteria[@name='CritCallStartDateLower']))"/>
    <xforms:bind id="bindCallCustomerID" required="false()" type="xforms:positiveInteger" nodeset="/request/criterias/criteria[@name='CritCallCustomerID']"/>
    <xforms:bind id="bindCallCustomerLastName" required="false()" type="xforms:string" nodeset="/request/criterias/criteria[@name='CritCallCustomerLastName']"/>

    <xforms:submission id="search" ref="/request" replace="none"/>
    <xforms:submission id="order" ref="/request" replace="none"/>


    <xforms:setvalue ev:event="xforms-model-construct-done" ref="/request/criterias/criterias/criteria[@name='CritCallStartDateLower']" value="days-to-date(days-from-date(local-date()) - 182) "/>
    <xforms:setvalue ev:event="xforms-model-construct-done" ref="/request/criterias/criterias/criteria[@name='CritCallStartDateUpper']" value="days-to-date(days-from-date(local-date())) "/>

  </xforms:model>

При отправке формы добавляются значения к критериям, и это выглядит так:

<criterias relation="AND">
    <criterias relation="OR">
        <criteria name="CritCallStartDateLower" operator="GreaterOrEqual" model="CallStartDate" gui_display="From date">value1</criteria>
        <criteria name="CritCallStartDateUpper" operator="LessOrEqual" model="CallStartDate" gui_display="To date">value2</criteria>
    </criterias>
    <criteria name="CritCallCustomerID" operator="Equal" model="CustomerID" gui_display="Customer ID">value3</criteria>
    <criteria name="CritCallCustomerLastName" operator="BeginWith" model="CustomerLastName" gui_display="Customer LastName"/>
</criterias>

Что мне нужно сделать, так это написать Xform, которая будет привязывать значение либо к атрибуту, либо к дочернему элементу в пределах критериев. Например:

<criterias relation="AND">
    <criterias relation="OR">
        <criteria name="CritCallStartDateLower" operator="GreaterOrEqual" model="CallStartDate" gui_display="From date" value="value1"></criteria>
        <criteria name="CritCallStartDateUpper" operator="LessOrEqual" model="CallStartDate" gui_display="To date"><value>value2<value></criteria>
    </criterias>
    <criteria name="CritCallCustomerID" operator="Equal" model="CustomerID" gui_display="Customer ID"></criteria>
    <criteria name="CritCallCustomerLastName" operator="BeginWith" model="CustomerLastName" gui_display="Customer LastName"/>
</criterias>

Любая помощь будет оценена, спасибо!

1 ответ

Решение

Вы могли бы использовать set-value два раза, один для атрибутов, другой для элементов. Если атрибут или значение не найдены, ничего не произойдет.

<xforms:setvalue ev:event="xforms-model-construct-done" ref="/request/criterias/criterias/criteria[@name='CritCallStartDateUpper']/@value" value="here is the new value"/>
<xforms:setvalue ev:event="xforms-model-construct-done" ref="/request/criterias/criterias/criteria[@name='CritCallStartDateUpper']/value" value="here is the new value"/>
Другие вопросы по тегам