2015-10-25 34 views
2

我真的很苦惱XForms。這段代碼有兩個問題。我的刷新操作不起作用,並且我的position()值無效。我無法找到任何指定哪些元素被允許/需要彼此嵌套的文檔。看起來XForms具有巨大的能力,但我無法獲得任何東西來連接。這只是設置「sel」爲2.我也試過「value =」instance('foo')/ bar [index('ns')]/position()「」,因爲我不確定if只有ref屬性繼承上下文節點。XForms:使用select元素獲取模型中項目的位置

<html xmlns="http://www.w3.org/1999/xhtml" xmlns:ev="http://www.w3.org/2001/xml-events" xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:xf="http://www.w3.org/2002/xforms"> 
<body> 
    <xf:model id="master"> 
     <xf:instance xmlns="" id="test"> 
      <foo> 
       <bar>test</bar> 
       <bar>error</bar> 
       <sel>1</sel> 
      </foo> 
     </xf:instance> 
    </xf:model> 
    <xf:output ref="sel"/> 
    <xf:select1 id="sl" ref="instance('test')/sel"> 
     <xf:itemset id="ns" nodeset="instance('test')/bar[.='error']"> 
      <xf:label ref="."/> 
      <xf:value value="./position()"/> 
     </xf:itemset> 
     <xf:action> 
      <xf:refresh model="master"/> 
     </xf:action> 
    </xf:select1> 
</body> 
</html> 

任何有關所有XForms元素的規則和類別的文獻也將被讚賞。 http://www.w3.org/TR/xforms/確實使它看起來像一個select元素和一個trigger元素是類似的東西。但是,如果他們是,爲什麼我的刷新工作在trigger而不是select

回答

1

首先,position()函數根據選定的節點列表進行評估,並且在此示例中,由於謂詞只有一個元素。可以像「count(preceding-sibling :: bar)+1」中那樣使用count()函數。

關於該操作,需要使用ev:event屬性來指示何時執行操作。

+0

非常感謝。爲了看到我的期望,我必須將增量設置爲true。計數功能也起作用。如果你不介意,爲什麼我需要引用前面的兄弟姐妹,然後添加一個?我不會想到這一點。 – zepperik

1

您的代碼的幾個注意事項:

  • 通常的XForms模型被放置在HTML head元素下,雖然允許實現模型放置在其他地方。
  • 我看不出您的代碼如何將sel的值設置爲2,因爲您要對標籤爲「error」且值爲2的單個項目進行下拉控件。但沒有代碼將sel的值設置爲2。這是因爲只有當用戶更改下拉菜單中的選定值時,值纔會更改,但用戶無法這樣做,因爲只有一個項目。
  • 在XForms中,您很少需要明確的refresh操作。數據模型更改完成後,視圖會自動刷新。
  • 是的,trigger就像是select1:a core form control
  • 所有XForms操作都需要通過ev:event屬性(或帶有某些實現的普通event)來確定它們對哪個事件作出反應。您的action操作沒有ev:event屬性,因此無法運行。
  • XForms現在推薦始終使用ref而不是nodeset。一些實現已經支持。
  • position() XPath表達式有時很棘手,因爲它只能在XPath上下文位置之後工作。隨着Orbeon,使用position()作爲您展示的作品。但如果沒有,你也可以嘗試使用count(preceding::bar) + 1來計算位置。

,我取得了你的項目集點兩個bar元素與Orbeon下面的作品,在這個意義上,如果用戶更改選擇,在sel的值發生變化。沒有必要進行明確的操作或刷新,因爲下拉框會在其更改時將其值寫入sel元素。

<html 
    xmlns="http://www.w3.org/1999/xhtml" 
    xmlns:ev="http://www.w3.org/2001/xml-events" 
    xmlns:xs="http://www.w3.org/2001/XMLSchema" 
    xmlns:xf="http://www.w3.org/2002/xforms"> 
    <head> 
     <xf:model id="master"> 
      <xf:instance xmlns="" id="test"> 
       <foo> 
        <bar>test</bar> 
        <bar>error</bar> 
        <sel>1</sel> 
       </foo> 
      </xf:instance> 
     </xf:model> 
    </head> 
    <body> 
     <xf:output ref="sel"/> 
     <xf:select1 id="sl" ref="sel"> 
      <xf:itemset id="ns" nodeset="instance('test')/bar"> 
       <xf:label ref="."/> 
       <xf:value value="position()"/> 
      </xf:itemset> 
     </xf:select1> 
    </body> 
</html>