使用xmldb时遇到问题:使用空间

时间:2016-12-25 23:45:15

标签: xquery exist-db

我似乎无法做到这一点。我有一个系统,其中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>&#160;&#160;&#160;{$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并从中创建字符串的组合,但似乎没有任何效果。

2 个答案:

答案 0 :(得分:1)

如果您的集合或资源名称可能包含需要编码的字符,则需要在名称上使用xmldb:encode-uri()。在第一个示例中,您对集合名称($collection)进行编码,但不对资源名称($file)进行编码。在第二个示例中,您对集合名称进行了预编码,但资源名称不包含需要编码的字符;所以你已经完全考虑了编码。

注意确保编码的集合名称确实存在。如果没有,您应该预先创建集合。这实际上可能是您引用错误的原因。

在HTML输出中创建指向这些资源的链接时,请注意不要对它们进行双重编码。

您可能会发现引用处理编码的应用程序很有用。请参阅eXide https://github.com/wolfgangmm/eXide的来源。

答案 1 :(得分:1)

答案是许可问题(虽然我有点迷失)。 该集合有rw-rw-r--并且用户在该组中,实际上是该集合的所有者。

当我更改为包含execute(rwxrwxr--)时,它按预期工作。令人困惑,但显然是在将要存储到的集合中的必需中执行权限。