XQuery/发布概览
您有一个工作流程,允许内部团队在将网络内容传输到公共网站之前对其进行审查。当文档被标记为“已批准发布”时,它们必须以受控的方式传输到公共网络服务器。
有很多方法可以将 XML 文档从一台服务器传输到另一台服务器。本文档将描述一组基本方法,这些方法可能会根据您的本地配置而有所不同。在本文件中,将使用以下图表。
许多组织对谁有权将内容发布到公共网站都有严格的政策指南。在将内容传输到公共网站之前,打算发布的文档通常会经过一系列阶段
- 草稿 - 处于质量控制过程早期阶段的文档
- 审核中 - 由编辑团队审核质量的文档,例如内容质量、拼写和排版错误
- 已批准发布 - 已批准在公共网站上发布的文档。
所有已标记为已批准发布的文档都可以从内部内容站点传输到公共网络服务器。通常,只有具有特定角色的指定用户才能将文档标记为已批准发布。
创建发布脚本有几种选择。我们将从一个非常简单的脚本开始,然后添加功能。
发布文档最简单的方法是使用 eXist(或 EXQuery)[1] 库。此库具有 PUT 和 DELETE 操作,可用于以编程方式在您的发布服务器上添加和删除网络内容。
以下是如何使用 httpclient:put() 函数的示例
httpclient:put($url as xs:anyURI, $content as node(), $persist as xs:boolean, $request-headers as element()?) item()
优点:非常易于使用 缺点:没有谁在何时发布了什么内容的中央审计跟踪
另一种方法是在公共网站上创建一个中央发布服务,以协调所有发布事件。这可以通过使用 HTTP POST 客户端函数来完成,然后编写一个单一的发布服务器来捕获和记录所有发布事件。
httpclient:post($url as xs:anyURI, $content as node(), $persist as xs:boolean, $request-headers as element()?) item()
您必须记住为 URL 使用强制转换为 xs:anyURI。例如
let $post-status := httpclient:post(xs:anyURI('http://example.com/db/get-doc.xq'), $doc-to-publish, true(), ())
通常,在公共网络服务器上指示一个网络服务,您现在有一个新的资源已准备好发布,但不要在请求中推送整个文件到公共网站。只有资源的 URL 被发送到公共网络服务器,其中包含四个参数
- 发布文档的用户
- 任何身份验证凭据
- 类型(发布或删除)
- 关于发布或删除原因的评论
- 要从中央内容管理系统由公共网络服务器拉取的文档标识符,或要删除的文档的 ID
然后,公共网络服务器调用一个函数,从系统内部的内容管理系统加载该资源。这可以通过标准的 URL 参数来完成。请注意,在这种情况下,密码将位于网络日志文件中。
使用 publish-with-callback.xq 获取 URL 参数的示例
(: The user that will execute the login :)
let $user := request:get-parameter('user', '')
(: The pass that will execute the login :)
let $pass := request:get-parameter('pass', '')
(: The full URL of the document we are going to bring over :)
let $url := request:get-parameter('url', '')
(: the /db location we are going to put the new document into :)
let $db-loc := request:get-parameter('db-loc', '')
(: This is the document fetch from the internal CMS server :)
let $get-doc := doc($url)
请注意,这种样式更安全,因为只有存在于内部内容管理系统中的文档才适合发布。
如果您使用中央网络服务进行发布,您现在可以在一个集中式的日志文件中记录所有发布事件。然后,可以使用此文件来报告和审核谁在何时更改了公共网站上的哪些内容。
以下示例显示如何将所有发布事件添加到日志文件中,该文件显示哪些用户发布了哪些文件以及它们何时发布或删除。在以下示例中,类型代码应设置为发布或删除。
let $audit-log :=
<publish-event>
<type-code>publish|delete</type-code>
<user>{$user}</user>
<dateTime>{current-dateTime()}</dateTime>
<db-loc>{$db-loc}</db-loc>
</publish-event>
(: check that the log file exists and if not then create it :)
let $check-log-exists :=
if (doc-available($log-file))
then ()
else
xmldb:store(
functx:substring-before-last($log-file, '/'),
functx:substring-after-last($log-file, '/'),
<publish-events/> )
(: this inserts the audit record at the end of the log file :)
let $update := update insert $audit-log into doc($log-file)/publish-events
有时无法在内部 CMS 系统和发布网站之间创建安全连接。另一种方法是为每个有权向发布服务器发布文档的系统提供证书。