如何将参数从输入控件传递给xquery函数并在按下按钮时调用它?

时间:2016-06-06 12:28:57

标签: html xquery xforms exist-db

我创建了xquery函数,它返回一个表:

declare function local:table($collection as xs:string*, $interface as xs:string?, $date as xs:string?) as node() {
<table border="1">
    <thead>
        <tr>
            <th>Inteface Name</th>
            <th>Test Date</th>
            <th>Test Result</th>
            <th>Report Link</th>
        </tr>
    </thead>
    <tbody>
    {   
        for $child in xmldb:get-child-resources($collection)
        let $doc := fn:doc(fn:concat($collection, '/', $child))
        where (fn:ends-with($child, '.xml')) 
                and (($doc//*:interfaceName/text() eq $interface) or empty($interface))
                and (($doc//*:reportDate/text() eq $date) or empty($date))
        order by $doc//*:reportDate/text() descending      
        return
        <tr>
            <td>
                {$doc//*:interfaceName/text()}   
            </td>
            <td>
                {$doc//*:reportDate/text()}  
            </td>
            <td>
                {$doc//*:testResult/text()}  
            </td>
            <td>
                <li>
                <!--<a href="{document-uri(fn:doc(fn:concat($collection, '/', $child)))}">{$child}</a> -->
                <a href="http://localhost:8080/exist/rest/db/junitReports/Report1.xml">  {$child}</a> 
                </li>
            </td>
        </tr>
    }
    </tbody>
</table>

我还在页面上添加了一些输入控件。其中一个看起来像:

  <InterfaceName constraint="true" readonly="false" required="false" relevant="true">
       <value>test</value>
  </InterfaceName>


<xf:bind nodeset="InterfaceName">
<xf:bind nodeset="value" type="string"/>

<xf:input id="InterfaceName" ref="InterfaceName/value" incremental="true">
        <xf:label></xf:label>
        <xf:hint>xxxxxYYYZZZ</xf:hint>
        <xf:help>Enter interface name</xf:help>
        <xf:alert>Enter interface name</xf:alert>
</xf:input>

我还在网页上添加了一个按钮:

<trigger1 constraint="true" readonly="false" required="false" relevant="true">
    <value></value>
</trigger1>

<xf:submission id="s-send"
        replace="instance"
        resource="echo:test"
        method="get">
 </xf:submission>

<div>
    <xf:trigger id="trigger1" ref="trigger1/value" incremental="true">
        <xf:label>Filter output</xf:label>
        <xf:hint>a Hint for this control</xf:hint>
        <xf:help>help for trigger1</xf:help>
        <xf:send submission="s-send"/>
    </xf:trigger>
</div>

在此按钮上单击我需要以某种方式将参数从那些输入控件传递到xquery函数并将表返回到网页。整个网页的类型为xQuery(它构建html)并使用eXist-db运行。 你能帮我解决这个问题吗?

谢谢。

1 个答案:

答案 0 :(得分:1)

您需要四个元素才能实现目标:

  1. <xf:instance id="result" >用于存储调用xquery的结果。确保添加id属性以进一步标识实例。

  2. <xf:submission>调用xquery将结果存储在实例中。这是您在<xf:send>中调用的提交内容,可能如下所示:

  3. &#13;
    &#13;
      <xf:submission id="s-send" method="get" replace="instance" instance="result">
       <xf:resource value="concat('myxquery.xq?interface=',InterfaceName/value)"/>
      </xf:submission>
    &#13;
    &#13;
    &#13;

    请注意,concat函数用于构建xquery url,包括参数。

    1. 显示结果实例内容的<xf:output value="instance('result')" mediatype="application/xhtml+xml">。显示html表需要mediatype="application/xhtml+xml"属性。
    2. 在服务器端,你不能直接调用xquery函数,你需要编写一个调用函数的xquery(myquery.xq)并从URL中提取参数。

      查看此示例https://en.wikibooks.org/wiki/XQuery/Getting_URL_Parameters