MarkLogic 中的多 select 输入字段

multi-select input fields in MarkLogic

我在表单中有一个多 select 输入字段,在本例中它是一组复选框,但它可能是一个多 select 下拉列表。 这些字段在表单中看起来很好,但在提交表单时请求会抛出错误。查询字符串是:

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

PHP 将多 select 输入字段作为数组处理。我认为 xquery 会将它们视为序列。显然,xquery 无法处理 http 请求中的此类字段。有没有人成功地处理了 xquery 中的多 select 输入字段?

这是生成表单字段的 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[] 中的括号。

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

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

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

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

客户端中的 XSLT 似乎没有正确创建 URL 参数。 HTTP 通过为每个值重复参数来支持多值参数,而不是使用具有值数组的单个参数。 HTTP 中多值参数的语法独立于用于访问这些值的服务器语言的语法。

希望对您有所帮助。

必须将此位作为 "answer" 输入,即使它不是答案,因为它太长了,无法发表评论。错误是在用于此应用程序的 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 :)
    }
};