我似乎无法做到这一点。我有一个系统,其中Web用户正在运行jQuery请求以添加新文档。如果他们存储的集合名称中没有空格,则代码可以完美运行。这段代码是:
xquery version "3.0";
declare option exist:serialize "method=xhtml media-type=text/html indent=yes";
let $specialty := request:get-parameter("specialty", "")
let $collection := xmldb:encode-uri($specialty)
let $docnum := request:get-parameter("docnum", "")
let $title := request:get-parameter("title", "")
let $file := concat($docnum, '.xml')
let $path := concat($collection, '/', $file)
let $content := <article>
<div
class="content"
doc="{$docnum}"
title="{xmldb:decode($title)}">
<div
class="panel">
<h1>First Panel</h1>
<p>Content goes here</p>
</div>
</div>
</article>
return
let $new_article := xmldb:store($collection, $file, $content, 'application/xml')
return
let $changepermiss := sm:chmod($new_article, 'rw-rw----')
return
<li
class="file"
data-xpath="{$path}"
>
<a
data-xpath="{$path}"
onclick="doc_open('{$path}')"
href="#"><span
class="glyphicon glyphicon-tags"></span>   {$docnum, ': ', xmldb:decode($title)}</a>
</li>
现在,如果来自请求的集合名称包含空格......就像这样(在编码之后)......它失败了。
“/分贝/测试/数据/核心/测试%20Collection”
错误是:
exerr:ERROR找不到集合:/ db / Test / data / Core / Test%20Collection
这发生在以下行:xmldb:store($ collection,$ file,$ content,'application / xml'),因为空间而无法识别$ collection。
现在,为了测试一下,我运行它就没事了。
xquery version "3.0";
declare option exist:serialize "method=xhtml media-type=text/html indent=yes";
let $test := "/db/EIDO/data/Core/Disease%20Prevention"
let $content := <article>
<div
class="content"
doc="D777"
title="Test Document">
<div
class="panel">
<h1>First Panel</h1>
<p>Content goes here</p>
</div>
</div>
</article>
return
let $newdoc := xmldb:store($test, "test.xml", $content, 'application/xml')
return
$newdoc
我无法理解我在尝试使用xmldb:store中的空格引用集合时出错了。
注意:正如我所说,如果集合名称中没有空格,代码就可以工作。
我尝试了很多编码URL并从中创建字符串的组合,但似乎没有任何效果。
答案 0 :(得分:1)
如果您的集合或资源名称可能包含需要编码的字符,则需要在名称上使用xmldb:encode-uri()
。在第一个示例中,您对集合名称($collection
)进行编码,但不对资源名称($file
)进行编码。在第二个示例中,您对集合名称进行了预编码,但资源名称不包含需要编码的字符;所以你已经完全考虑了编码。
注意确保编码的集合名称确实存在。如果没有,您应该预先创建集合。这实际上可能是您引用错误的原因。
在HTML输出中创建指向这些资源的链接时,请注意不要对它们进行双重编码。
您可能会发现引用处理编码的应用程序很有用。请参阅eXide https://github.com/wolfgangmm/eXide的来源。
答案 1 :(得分:1)
答案是许可问题(虽然我有点迷失)。 该集合有rw-rw-r--并且用户在该组中,实际上是该集合的所有者。
当我更改为包含execute(rwxrwxr--)时,它按预期工作。令人困惑,但显然是在将要存储到的集合中的必需中执行权限。