如何在 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 上或在引用之后的字符串上)。
另请参阅:
我们需要使用 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 文档获取为 HTML5http://localhost:8011/v1/documents?uri=/path/to/the/doc.xhtml \ &transform=html5ifier
您可以在转换中对 XHTML 文档进行其他更改(在引用之前的 XML 上或在引用之后的字符串上)。
另请参阅: