2013-01-18 20 views
1

我需要在使用XForms編輯XML文檔時驗證條件。XForms - 對節點集的約束

完整的示例網頁包含在下面。

我想驗證兩件事情

  1. 值內的「V」元素是整數
  2. V的每個值大於「最大」元素中值較小(因此樣本文件不應通過驗證,因爲裏面的值/ DOC /價值/ REC [3] 4,大於3的內部/ DOC /最大

我不知道如何設置XF的屬性:綁定 使用此:

<xf:bind id="bindv" 
     nodeset="instance('i1')/values/rec/v" 
     type="integer" /> 

<xf:input bind="bindv"> 

導致該XF:輸入僅編輯第一 'V'。

<html xmlns="http://www.w3.org/1999/xhtml" 
     xmlns:ev="http://www.w3.org/2001/xml-events" 
     xmlns:xf="http://www.w3.org/2002/xforms"> 
    <head>   
     <xf:model> 
      <xf:instance xmlns="" id="i1"> 
       <doc> 
        <max>3</max> 
        <values> 
         <rec> 
          <v>1</v> 
         </rec> 
         <rec> 
          <v>2</v> 
         </rec> 
         <rec> 
          <v>4</v> 
         </rec> 
        </values> 
       </doc> 
      </xf:instance>   
     </xf:model>  
    </head> 
    <body> 
     <div> 
      <table> 
       <thead> 
        <th>Value</th>           
       </thead>  
       <tbody id="values-repeat" 
        xf:repeat-nodeset="instance('i1')/values/rec"> 
        <tr> 
         <td> 
          <xf:output ref="v" /> 
         </td>      
        </tr> 
       </tbody>     
      </table> 

      <xf:group ref="instance('i1')/values/rec[index('values-repeat')]" 
       appearance="full">    
       <xf:input bind="bindv"> 
        <xf:label>v:</xf:label> 
       </xf:input> 
      </xf:group> 
     </div> 
    </body> 
</html> 

回答

1

與大多數XForms控件一樣,xf:input控件執行規範所稱的「單節點綁定」。如果綁定到包含多個節點的節點集,它將綁定到第一個節點。 (你已經注意到了這一點。)這個問題是不是在綁定元素,這是很好的,只要它去,但在使用的

<xf:input bind="bindv"/> 

當你的意思可能是更多的東西一樣

<xf:group ref="instance('i1')/values/rec[index('values-repeat')]" 
      appearance="full">    
    <xf:input ref="v"> 
     <xf:label>v:</xf:label> 
    </xf:input> 
</xf:group> 

當我如上所示更改group(並且更改了tbody的處理,由於我正在使用的XForms處理器不支持xf:repeat-nodeset屬性),該表單的工作原理與此相似:有三個值和一個輸入小部件,當我單擊其中一個值時,該值出現在輸入區域中。

請注意,您不必將輸入小部件綁定到bindv綁定以使類型信息生效;在xf:bind元素中聲明的屬性適用於其節點集中的節點,並且當您將輸入小部件綁定到其中一個節點時,它就知道這些屬性。

綁定上的ID可以在xf:repeat上使用,如果您願意的話。該TBODY,例如,可以這種方式表達:

<tbody> 
    <xf:repeat bind="bindv" id="values-repeat" > 
     <tr> 
      <td> 
       <xf:output ref="." /> 
      </td>      
     </tr> 
    </xf:repeat> 
</tbody> 

要添加值應嚴格大於instance('i1')/max值少的約束,可以使XF:綁定說是這樣的:

<xf:bind id="bindv" 
     nodeset="instance('i1')/values/rec/v" 
     type="integer" 
     constraint=". &lt; ../../../max" 
     /> 

請注意,用於評估constraint屬性中的XPath表達式的上下文節點是nodeset的(或當前)成員。

當我添加constraint屬性時,當使用XForms處理器加載文檔時,出現錯誤信號與第三個值相對應。

+0

謝謝邁克爾,我不知道xf:bind中的約束適用於輸入,即使輸入聲明爲ref =「...」而不是bind =「...」。 –