2014-04-25 2 views
0

XBL에서 자체 구성 요소를 만들고있어 그 안에 제출 자료를 사용해야합니다. 내가 자원 및 결과 XPath를 제공과 더불어, REST 제출을 호출 할제출시 동적으로 XPath 설정

<xbl:binding element="fr|myControl" id="fr-myControl" xxbl:mode="lhha binding value"> 
<metadata xmlns="...."> 
.... 
<templates> 
    <instance label=""/> 
    <view> 
     <fr:myControl id="" appearance="minimal" xpath="" xmlns="" resource="" > 
      <xf:label ref=""/> 
      <xf:hint ref=""/> 
      <xf:help ref=""/> 
      <xf:alert ref=""/> 
     </fr:myControl>   
    </view> 
</templates> 

<control-details> 
    <xf:input ref="@resource"> 
     .... 
    </xf:input> 
    <xf:input ref="@xpath"> 
     .... 
    </xf:input> 
</control-details>   
</metadata> 
.... 

: 그리고 나는 사용자가 (자동 완성 제어와 같은) 폼 빌더에서 제공 할 수있는 제출 된 두 개의 매개 변수 (자원, XPath를) 가지고 폼 빌더 사용자 (@resource@xpath) 기준 :

<xf:model> 
<xf:instance id="result"><value/></xf:instance> 
<xf:instance id="sub"><value/></xf:instance> 
<xf:instance id="resource"><value/></xf:instance> 
<xf:instance id="xpath"><value/></xf:instance>  
.... 
<xf:submission id="my-submission" instance="sub" 
mediatype="application/xml" 
method="get" 
resource="{instance('resource')}" 
replace="instance" 
serialization="none"/>      
    <xf:action id="populate-data-binding">       
     <xf:action context="instance('sub')" 
     ev:event="xforms-submit-done" 
     ev:observer="my-submission">      
      <xf:action>                  
       <!-- there is a problem--> 
       <xf:var as="xs:string" name="control-value" value="instance('xpath')"/>        
       <xf:setvalue ref="instance('result')" value="$control-value"/> 
      </xf:action>     
     </xf:action>    
    </xf:action> 
</xf:model> 

.... 

<xf:var name="resource-avt" xbl:attr="xbl:text=resource" xxbl:scope="outer"/> 
<xf:var name="resource" xbl:attr="xbl:text=resource" > 
    <xf:action ev:event="xforms-enabled xforms-value-changed"> 
     <xf:setvalue ref="instance('resource')" value="$resource"/> 
    </xf:action> 
</xf:var> 

<xf:var name="xpath-avt" xbl:attr="xbl:text=xpath" xxbl:scope="outer"/> 
<xf:var name="xpath" xbl:attr="xbl:text=xpath" as="xs:string"> 
    <xf:action ev:event="xforms-enabled xforms-value-changed"> 
     <xf:setvalue ref="instance('xpath')" value="$xpath"/> 
    </xf:action> 
</xf:var> 

내 문제 위에서 강조된 라인이다 /pathToResult : instance('xpath')에서 I는, 예를 들어 폼 빌더의 사용자에 의해 제공되는 파라미터의 값을 갖는다. /pathToResult과 연결된 제출 리소스에서 XML 결과의 일부를 가져 오려고합니다. 응답 XML에 대한 예를 들어, 대신 예상 된 결과의 /pathToInstance : 그러나 불행하게도 instance('result')에서이 결과 인스턴스의

<xml> 
    <blabla>bla</blabla> 
    <pathToResult>MY RESULT !!!</pathToResult> 
</xml> 

예상 값은 다음과 같습니다 MY RESULT !!! 대신 /pathToResult.

<xf:var as="xs:string" name="control-value" value="/pathToResult"/> 

가 잘 작동하지만,이 경우 경로가 하드 코드 :이 같은 코드를 수정하지만 경우

. 대신 Form Builder 사용자에게 컨트롤 구성에서 XPath 표현식을 지정할 기회를 제공하고 싶습니다.

예상 효과에 도달하도록 코드를 수정하려면 어떻게해야합니까?

답변

1

하나의 대답은 other question에 제공된 것과 유사합니다. 사용 saxon:evaluate().

<xf:setvalue ref="instance('result')" value="saxon:evaluate(instance('xpath'))"/> 

또 다른 방법은 다음과 같습니다. 로컬 XBL 모델이 <xbl:template> 미만인 경우 XBL 바운드 노드에있는 특성을 사용하여 모델을 수정할 수 있습니다. 그래서 예를 들면 :

<xf:submission xbl:attr="resource" ...> 

이 복사 <xf:submission> 요소 <fr:mycontrol>resource 속성.

이 방법은 더 간단하며 원하는대로 정확하게 수행해야합니다.