如何在 MarkLogic 中保留 HTML5 文档类型?

How to preserve the HTML5 doctype in MarkLogic?

我们需要使用 Java 客户端 API 或 REST API.

在 MarkLogic 中存储和检索格式正确的 HTML5 文档

每个文档都有一个“.html”扩展名和标准 HTML5 文档类型。插入文档时,默认情况下它们会存储为文本文档。

我们想使用 MarkLogic 提供的所有优点来搜索和操作文档,就好像它们是 XHTML,但我们需要保留 HTML5 文档类型和 .html 扩展以与其他工具兼容。我相信我们不是唯一遇到这种情况的人。

我们已尝试将 HTML mimetype 更改为 XML,但是当插入文档时,doctype 会被替换为 XML doctype。有没有办法在不丢失文档类型的情况下插入和检索格式良好的 HTML5 文档?

没有将文档类型保存在数据库中的本机方法(XQuery 不支持文档类型)。但是使用一些逻辑,您可以在请求文档时添加回文档类型。

例如:

declare function local:get-with-doctype(
    $document as document-node()
) as xs:string
{
    if (ends-with(xdmp:node-uri($document), '.html')
    then document { 
      text{ '<!DOCTYPE html>' }, 
      xdmp:quote($document) 
    }
    else $document
};

或者,您可以在插入文档时从文档中解析出文档类型,并将其存储在文档中 属性。然后当请求文档时,您总是可以添加 属性 中的那个。但是,只有当您需要处理许多文档类型时,这可能才值得。

稍微扩展一下 WST 的答案,您可以将文档存储为 XHTML 并使用

在 REST API 转换中进行转换
  • XQuery 转换中的 xdmp:quote() 函数,
  • XSLT 转换中的 xsl:output 语句,或
  • MarkLogic 8 中 JavaScript 转换中的 xdmp.quote() 函数。

REST 的可能 XQuery 转换 API:

xquery version "1.0-ml";
module namespace html5ifier =
    "http://marklogic.com/rest-api/transform/html5ifier";

declare default function namespace "http://www.w3.org/2005/xpath-functions";
declare option xdmp:mapping "false";

declare function html5ifier:transform(
    $context as map:map,
    $params  as map:map,
    $content as document-node() 
) as document-node()
{
    map:put($context,"output-type","text/html"),

    document{text{
        xdmp:quote($content,
            <options xmlns="xdmp:quote">
                <method>html</method>
                <media-type>text/html</media-type>
                <doctype-public>html</doctype-public>
            </options>)
        }}
};

如果您的 REST 服务器在端口 8011 上,您将使用 PUT 请求安装转换:

http://localhost:8011/v1/config/transforms/html5ifier

然后,您可以使用转换

将持久化的 XHTML 文档获取为 HTML5
http://localhost:8011/v1/documents?uri=/path/to/the/doc.xhtml \
    &transform=html5ifier

您可以在转换中对 XHTML 文档进行其他更改(在引用之前的 XML 上或在引用之后的字符串上)。

另请参阅:

http://markmail.org/message/qmsos7np64ohyctp