MarkLogic中的多选输入字段

时间:2015-03-26 20:38:11

标签: xslt xquery marklogic

我在表单中有一个多选输入字段,在这种情况下它是一组复选框,但它可以是多选下拉列表。 表单中的字段看起来很好,但是在提交表单时请求会引发错误。查询字符串是:

?headings=on&text=on&references=on&book-category[]=mis&book-category[]=bds&book-category[]=gts

PHP将多选输入字段作为数组处理。我以为xquery会将它们视为序列。显然,xquery无法在http请求中处理这样的字段。有没有人成功处理xquery中的多选输入字段?

这是生成表单字段的xslt,在源代码中看起来非常好。

    <xsl:for-each select="r:body/sidebar/search:facet[@name='category']/search:facet-value">
    <xsl:variable name="category-display" select="text()"/>
    <xsl:variable name="category-name" select="encode-for-uri(string-join(tokenize(lower-case(text()), ' '), ''))"/>
    <xsl:variable name="category-id" select="encode-for-uri(concat('adv_books_', string-join(tokenize(lower-case(text()), ' '), '')))"/>
    <li>
    <input type="checkbox" name="book-category[]" id="{$category-id}" value="{$category-name}" class="checkbox" />
    <label for="{$category-id}"><xsl:value-of select="$category-display" /></label>
    </li>
    </xsl:for-each>

以下是日志中的错误:

2015-03-26 21:16:54.017 Notice: 8040-MYSITE-HTTP: XDMP-QNAMELEXFORM: for $param in xdmp:get-request-field-names() -- Invalid lexical form for QName

我认为xquery不喜欢参数book-category []中的括号。

2 个答案:

答案 0 :(得分:1)

MarkLogic支持具有多个值的HTTP参数,在XQuery中返回值为

的序列

http://docs.marklogic.com/xdmp:get-request-field

在MarkLogic 8中,您还可以使用JavaScript:

http://docs.marklogic.com/xdmp.getRequestField

看起来客户端中的XSLT没有正确创建URL参数。 HTTP通过重复每个值的参数而不是具有该值的数组的单个参数来支持多值参数。 HTTP中多值参数的语法与用于访问值的服务器语言的语法无关。

希望有所帮助。

答案 1 :(得分:0)

必须输入此位作为&#34;答案&#34;虽然它不是一个答案,因为它的评论时间太长了。该错误是从用于此应用程序的MVC框架的文件中抛出的,我对更改框架代码犹豫不决:

declare function utils:get-request()
as element(req:request)
{
  element {fn:QName("http://marklogic.com/mvc/request","request")} {
    attribute method {fn:lower-case(xdmp:get-request-method())},
    attribute rewrite-url {xdmp:get-request-url()},
    attribute protocol {xdmp:get-request-protocol()},
    attribute client-ip {xdmp:get-request-client-address()},
    element req:status-code {200},
    element req:message {"OK"},
    element req:session {
      for $field in xdmp:get-session-field-names()
      return
        element {fn:concat("req:",fn:lower-case($field))} {
          xdmp:get-session-field($field)
        }
    },
    element req:params {
      for $param in xdmp:get-request-field-names()
      where fn:not(fn:exists(xdmp:get-request-field-content-type($param)))
      return
        element {fn:concat("req:",fn:lower-case($param))} {
          attribute content-type {xdmp:get-request-field-content-type($param)},
          for $value in xdmp:get-request-field($param) return element req:value {$value}
        }
    },
    (: SOME MORE CODE HERE :)
    }
};