2012-02-17 5 views
3

바인딩에 대해 복잡한 계산을 수행 할 수있는 가능성을 찾고 있습니다. 다음의 예를 주어집니다 :XForms : 바인딩을위한 복잡한 계산

<root> 
    <appointments> 
    <appointment><date>2012-01-01</date></appointment> 
    <appointment><date>2012-01-03</date></appointment> 
    </appointments> 
    <weeks /> 
</root> 

weeks 노드는 appointment 노드에 따라 달라집니다

$weeks = 0 
$week_begin = xs:date("1970-01-01") 
for $appointment in //appointments/appoinment 
    if # Check if $appointment is in new week 
    $weeks = $weeks + 1 
    $week_begin = # Do some more calculationx 

내 문제는 내가 그 계산을 "넣어"위치를 알 수 없다는 것입니다. 보시다시피 루프 사이클 사이에 정보를 저장할 수있는 변수가있는 루프가 필요합니다. XForms를 함께 조합 변수 :

  1. XForms를 : 따라서, 나는 다음과 같은 옵션을 평가 한 => XForms를 반복 : 반복 내부 변수는 "외부"범위에
  2. XForms를 쓸 수 없습니다 : setValue의를 조합 임시 변수와 XForms를 보유하고 추가 인스턴스 :
  3. XForms를 반복 : 바인드를 계산 속성으로 =>의 XPath에서 루프가 가능하지만, 어떤 변수가

어떤 조언을하는 방법이 문제를 접근하지하는 하시나요? 고맙습니다!

+0

그런 복잡한 계산의 한 예를 들려 줄 수 있습니까? 위의 예제는 일종의 불완전합니다. – Jayy

+0

"알고리즘"을 더욱 구체화시킬 수있는 루비 코드가 있습니다. https://gist.github.com/c3bf9d7948a538b5bbd0 – lacco

답변

2

약속 노드 집합이 변경된 경우 트리거되는 Javascript에서 계산을 구현할 수 있습니다. Orbeon Forms를 사용하는 경우 xxforms:script 확장자를 사용할 수 있습니다. Orbeon 위키는 example how to set an instance value based on a javascript calculation입니다.

또 다른 해결책은 계산을 "외부화"하고 계산 결과를 반환하는 작은 웹 서비스 (XQuery?)를 만드는 것입니다. xforms:submit 메커니즘을 사용하여 해당 서비스에 피드를 제공하고 그 결과에 액세스 할 수 있습니다.

관련 문제