2013-10-08 48 views
0

我在XForms中有重複問題。我需要訪問循環內的單選按鈕字段的一些值。如果單選按鈕選擇了特定的值,範圍就是使輸入文本可見。我想要所有重複的這種行爲(單選按鈕和輸入文本字段在循環內)。獲取XForm中重複單選按鈕的值

它工作正常一行,但是當我添加一個新行,代碼不能正常工作了。

我複製一個簡單的例子來檢查這個行爲:

<xh:html xmlns:xh="http://www.w3.org/1999/xhtml" 
    xmlns:ev="http://www.w3.org/2001/xml-events" 
    xmlns:exf="http://www.exforms.org/exf/1-0" 
    xmlns:fb="http://orbeon.org/oxf/xml/form-builder" 
    xmlns:fr="http://orbeon.org/oxf/xml/form-runner" 
    xmlns:odt="http://orbeon.org/oxf/xml/datatypes" 
    xmlns:oxf="http://www.orbeon.com/oxf/processors" 
    xmlns:p="http://www.orbeon.com/oxf/pipeline" 
    xmlns:saxon="http://saxon.sf.net/" 
    xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/" 
    xmlns:sql="http://orbeon.org/oxf/xml/sql" 
    xmlns:xf="http://www.w3.org/2002/xforms" 
    xmlns:xi="http://www.w3.org/2001/XInclude" 
    xmlns:xpl="java:org.orbeon.oxf.pipeline.api.FunctionLibrary" 
    xmlns:xs="http://www.w3.org/2001/XMLSchema" 
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
    xmlns:xxf="http://orbeon.org/oxf/xml/xforms" 
    xmlns:xxi="http://orbeon.org/oxf/xml/xinclude"> 
<xh:head> 
    <xh:title>Loop</xh:title> 
    <xf:model id="fr-form-model" xxf:expose-xpath-types="true"> 
     <xf:instance xxf:readonly="true" id="fr-form-metadata"> 
      <metadata> 
       <application-name>DHszw</application-name> 
       <form-name>Loop</form-name> 
       <title xml:lang="en">Loop</title> 
       <description xml:lang="en">Description of the form.</description> 
      </metadata> 
     </xf:instance> 
     <xf:instance id="fr-form-instance"> 
      <form> 
       <category-1> 
        <subcategory-1-1/> 
        <element-1-1-1/> 
        <loop-group-0> 
         <loop-0> 
          <element-1-1-2/> 
          <element-1-1-3/> 
         </loop-0> 
        </loop-group-0> 
        <element-1-1-4/> 
        <element-1-1-5/> 
       </category-1> 
      </form> 
     </xf:instance> 
     <xf:bind xmlns:dataModel="java:org.orbeon.oxf.fb.DataModel" id="fr-form-binds" 
       ref="instance('fr-form-instance')"> 
      <xf:bind id="category-1-bind" name="category-1" ref="category-1"> 
       <xf:bind id="subcategory-1-1-bind" name="subcategory-1-1" ref="subcategory-1-1"/> 
       <xf:bind id="element-1-1-1-bind" name="element-1-1-1" ref="element-1-1-1"/> 
       <xf:bind id="group-loop-0-bind" name="group-loop-0-bind" ref="loop-group-0" 
         relevant="($element-1-1-1='yes')"> 
        <xf:bind id="loop-0-bind" name="loop-0" ref="loop-0" relevant="($element-1-1-1='yes')"> 
         <xf:bind id="element-1-1-2-bind" name="element-1-1-2" ref="element-1-1-2" 
           relevant="($element-1-1-1='yes')"/> 
         <xf:bind id="element-1-1-3-bind" name="element-1-1-3" ref="element-1-1-3" 
           relevant="($element-1-1-2='yes')"/> 
        </xf:bind> 
       </xf:bind> 
       <xf:bind id="element-1-1-4-bind" name="element-1-1-4" ref="element-1-1-4" 
         relevant="($element-1-1-1='no') or ($element-1-1-2='no')"/> 
       <xf:bind id="element-1-1-5-bind" name="element-1-1-5" ref="element-1-1-5" 
         relevant="($element-1-1-1='no') or ($element-1-1-2='no')"/> 
      </xf:bind> 
     </xf:bind> 
     <xf:instance id="fr-form-attachments"> 
      <attachments> 
       <css filename="" mediatype="text/css" size=""/> 
       <pdf filename="" mediatype="application/pdf" size=""/> 
      </attachments> 
     </xf:instance> 
     <xf:instance id="fr-form-resources" xxf:readonly="false"> 
      <resources> 
       <resource xml:lang="en"> 
        <category-1> 
         <label>LoopCategory</label> 
        </category-1> 
        <subcategory-1-1> 
         <label>&lt;b&gt;BasicSubcategory&lt;/b&gt;&lt;hr&gt;</label> 
         <hint/> 
         <alert/> 
        </subcategory-1-1> 
        <element-1-1-1> 
         <label>Do you want a loop?</label> 
         <hint/> 
         <alert/> 
         <item> 
          <label>yes</label> 
          <value>yes</value> 
         </item> 
         <item> 
          <label>no</label> 
          <value>no</value> 
         </item> 
        </element-1-1-1> 
        <element-1-1-2> 
         <label>Do you want an Input Text?</label> 
         <hint>More</hint> 
         <alert/> 
         <item> 
          <label>yes</label> 
          <value>yes</value> 
         </item> 
         <item> 
          <label>no</label> 
          <value>no</value> 
         </item> 
        </element-1-1-2> 
        <element-1-1-3> 
         <label>Your input text</label> 
         <hint/> 
         <alert/> 
        </element-1-1-3> 
        <element-1-1-4> 
         <label>Why no loop?</label> 
         <hint/> 
         <alert/> 
        </element-1-1-4> 
        <element-1-1-5> 
         <label>End:</label> 
         <hint/> 
         <alert/> 
        </element-1-1-5> 
       </resource> 
      </resources> 
     </xf:instance> 
     <xf:instance id="fr-service-request-instance" xxf:exclude-result-prefixes="#all"> 
      <response/> 
     </xf:instance> 
     <xf:instance xxf:readonly="true" id="loop-0-template"> 
      <loop-0> 
       <element-1-1-2/> 
       <element-1-1-3/> 
      </loop-0> 
     </xf:instance> 
    </xf:model> 
</xh:head> 
<xh:body> 
    <fr:view> 
     <fr:body xmlns:xbl="http://www.w3.org/ns/xbl" 
       xmlns:dataModel="java:org.orbeon.oxf.fb.DataModel"> 
      <fr:section bind="category-1-bind" id="category-1-control"> 
       <xf:label ref="$form-resources/category-1/label"/> 
       <xh:tr> 
        <xh:td> 
         <xf:output bind="subcategory-1-1-bind" id="subcategory-1-1-control"> 
          <xf:label mediatype="text/html" ref="$form-resources/subcategory-1-1/label"/> 
          <xf:hint ref="$form-resources/subcategory-1-1/hint"/> 
          <xf:alert ref="$fr-resources/detail/labels/alert"/> 
         </xf:output> 
        </xh:td> 
       </xh:tr> 
       <xh:tr> 
        <xh:td> 
         <xf:select1 appearance="full" bind="element-1-1-1-bind" id="element-1-1-1-control"> 
          <xf:label ref="$form-resources/element-1-1-1/label"/> 
          <xf:hint ref="$form-resources/element-1-1-1/hint"/> 
          <xf:alert ref="$fr-resources/detail/labels/alert"/> 
          <xf:itemset ref="$form-resources/element-1-1-1/item"> 
           <xf:label ref="label"/> 
           <xf:value ref="value"/> 
          </xf:itemset> 
         </xf:select1> 
        </xh:td> 
       </xh:tr> 
       <xf:group bind="group-loop-0-bind" id="group-loop-0-control"> 
        <fr:grid bind="loop-0-bind" id="loop-0-control" max="10" min="1" 
          origin="instance('loop-0-template')" 
          repeat="true"> 
         <xh:tr> 
          <xh:td> 
           <xf:select1 appearance="full" bind="element-1-1-2-bind" id="element-1-1-2-control"> 
            <xf:label ref="$form-resources/element-1-1-2/label"/> 
            <xf:hint ref="$form-resources/element-1-1-2/hint"/> 
            <xf:alert ref="$fr-resources/detail/labels/alert"/> 
            <xf:itemset ref="$form-resources/element-1-1-2/item"> 
             <xf:label ref="label"/> 
             <xf:value ref="value"/> 
            </xf:itemset> 
           </xf:select1> 
          </xh:td> 
         </xh:tr> 
         <xh:tr> 
          <xh:td> 
           <xf:input bind="element-1-1-3-bind" id="element-1-1-3-control"> 
            <xf:label ref="$form-resources/element-1-1-3/label"/> 
            <xf:hint ref="$form-resources/element-1-1-3/hint"/> 
            <xf:alert ref="$fr-resources/detail/labels/alert"/> 
           </xf:input> 
          </xh:td> 
         </xh:tr> 
        </fr:grid> 
       </xf:group> 
       <xh:tr> 
        <xh:td> 
         <xf:input bind="element-1-1-4-bind" id="element-1-1-4-control"> 
          <xf:label ref="$form-resources/element-1-1-4/label"/> 
          <xf:hint ref="$form-resources/element-1-1-4/hint"/> 
          <xf:alert ref="$fr-resources/detail/labels/alert"/> 
         </xf:input> 
        </xh:td> 
       </xh:tr> 
       <xh:tr> 
        <xh:td> 
         <xf:input bind="element-1-1-5-bind" id="element-1-1-5-control"> 
          <xf:label ref="$form-resources/element-1-1-5/label"/> 
          <xf:hint ref="$form-resources/element-1-1-5/hint"/> 
          <xf:alert ref="$fr-resources/detail/labels/alert"/> 
         </xf:input> 
        </xh:td> 
       </xh:tr> 
      </fr:section> 
     </fr:body> 
    </fr:view> 
</xh:body> 

如果這個代碼在Orbeon服務器上運行,它工作得很好,直到我們在「重複」元素添加一個新行。然後,無論在單選按鈕中選擇的值如何,輸入字段消失(或不可見)。

我想象中,加入該行的副本,將可能有相同的元素的名稱(或更改原始元素的名稱),並導致此問題。但我需要訪問每行的單選按鈕的值。可能嗎?這是一個已知的錯誤嗎?如何實現這一目標?

回答

1

可以使用相對路徑元素,而不是綁定變量來引用元素值重複之內,所以你的情況:

替換:

($element-1-1-2='yes') 

(../element-1-1-2='yes') 

另請參見orbeon calculated fields in a repeat break after first itiration

這不起作用重複之外;我不確定你在第二個元素-1-1-2條件中的預期邏輯。

問候

Jez的

+0

究竟;現在Jez的解決方法是要走的路。但@JorgeHortelano,你在做什麼是正確的,並且由於這個錯誤https://github.com/orbeon/orbeon-forms/issues/776,它現在無法在重複內部工作。 (幸運的是,解決方法不是太複雜。) – avernet

+0

嗨,亞歷克斯。我很好奇你稱之爲'錯誤',我更多地將它看作是使用綁定變量的一個約束。例如,如果變量在重複之外使用(重複上下文不可用)是否不會變得不確定? – Jez

+0

當在重複之外使用時,變量應該指向什麼是有爭議的。但是當在重複中使用時,期望實際上是指向「當前迭代」中的節點。與重複內部控件的事件調度問題非常相似。在那種情況下,哪個控件獲取事件取決於事件從哪裏發出,並且該事件被正確實現,所以算法已經大部分存在。 – avernet