在提交中动态设置XPath

时间:2014-04-25 12:47:40

标签: xpath orbeon submission xbl

我在XBL中制作自己的组件,我必须在其中使用提交。我有两个用户可以在表单生成器中提供的提交参数(资源,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>
.... 

然后我想调用REST提交,用户在表单构建器(@resource@xpath)中提供资源和结果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>

我的问题出现在上面突出显示的行中:instance('xpath')我在表单生成器中提供了用户提供的参数值,例如:/pathToResult。我想从与/pathToResult关联的提交资源中获取XML结果的一部分。但不幸的是,在instance('result')中有/pathToInstance而不是预期的结果,例如对于响应XML:

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

结果实例的期望值为:MY RESULT !!!而不是/pathToResult

但是,如果我修改了这样的代码:

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

效果很好,但在这种情况下,路径是硬编码的。我希望给表单生成器用户提供机会在控件配置中指定XPath表达式。

如何修改代码以达到预期效果?

1 个答案:

答案 0 :(得分:1)

一个答案类似于为此other question提供的答案:使用saxon: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>元素。

这更简单,应该完全按照你的意愿行事。