0

XBL で独自のコンポーネントを作成しており、その中でサブミッションを使用する必要があります。ユーザーが Form Builder で (オートコンプリート コントロールのように) 提供できる送信の 2 つのパラメーター (リソース、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>
.... 

@resource次に、ユーザーがフォーム ビルダー (および@xpath)で提供するリソースと結果の XPath を使用して、REST 送信を呼び出します。

<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>

私の問題は、上記の強調表示された行にあります。instance('xpath')たとえば、フォームビルダーでユーザーが提供したパラメーターの値があります/pathToResult。そして、 に関連付けられた送信リソースから XML 結果の一部を取得したいと考えています/pathToResult。しかし、残念なことに、期待される結果の代わりに、たとえば応答 XML の場合instance('result'):/pathToInstance

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

result-instance の期待値は:MY RESULT !!!ではなく です/pathToResult

ただし、次のようにコードを変更した場合:

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

うまく機能しますが、この場合、パスはハードコーディングされています。代わりに、Form Builder ユーザーがコントロール構成で XPath 式を指定できるようにしたいと考えています。

期待される効果が得られるようにコードを変更するにはどうすればよいですか?

4

1 に答える 1

1

1 つの答えは、この別の質問に対して提供されたものと似ています: usesaxon:evaluate()です。

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

別の方法は次のとおりです。ローカル XBL モデルが の下<xbl:template>にある場合、XBL バインド ノードに存在するアトリビュートを使用してモデルを変更できます。たとえば、次のようになります。

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

resourceこれにより、属性<fr:mycontrol><xf:submission>要素にコピーされます。

これはより簡単で、あなたが望むことを正確に行う必要があります。

于 2014-05-01T21:39:43.487 に答える