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 :)
}
};
我在表单中有一个多 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 :)
}
};