Marklogic中的日期格式问题

时间:2012-07-25 12:17:54

标签: xquery marklogic

我正在使用xdmp:document-filter(doc(uri))从文档中获取元数据。当我在其中一个文档上运行此命令时,我得到以下结果: -

xdmp:document-filter(doc(“/ Vision.doc”))// *:meta [@name eq“Creation_Date”] / @ content

<?xml version="1.0" encoding="UTF-8"?>
<results warning="attribute node">
  <warning warning="attributes cannot be root nodes" content="17-05-2012 00:48:00"/>
</results>

当我在另一个文档上运行此命令时,我得到了这个: -

<?xml version="1.0" encoding="UTF-8"?>
<results warning="attribute node">
  <warning warning="attributes cannot be root nodes" content="2012-06-03T13:45:00Z"/>
</results>

您可以看到两个输出中的日期格式不同。在Marklogic Server中上传的文档中可能有不同的日期格式。但我希望以某种固定格式(例如2012年5月16日)显示文档的创建日期。如何将不同的日期格式转换为固定的日期格式?而且我想将这些日期与用户输入的日期进行比较。搜索查询应返回与搜索条件匹配的文档。所以我在这里有两个问题: -

  1. 如何将特定文档的创建日期转换为某种固定格式并在UI中显示。
  2. 如何将此创建日期与用户输入的日期(格式为“mm / dd / yyyy”)进行比较,以便我得到正确的结果。

2 个答案:

答案 0 :(得分:2)

您必须解析dateTime值。例如:

let $dt := "17-05-2012 00:48:00"
return
  if ($dt castable as xs:dateTime)
  then xs:dateTime($dt)
  else xdmp:parse-dateTime("[Y01]-[M01]-[D01] [h01]:[m01]:[s01]", $dt)

这将返回xs:dateTime原子值,可以在UI中进行比较和显示。如果要支持其他格式,则需要创建其他解析“图片”字符串,以便它们也可以转换为xs:dateTime。有关详细信息,请参阅xdmp:parse-dateTime()上的文档。

答案 1 :(得分:1)

作为一个更大的开源项目的一部分,我编写了一个日期解析库,它可处理6种不同语言的至少20种不同格式。如果尚未定义格式,您还可以提供自己的格式。它的工作原理是以任何定义的格式将日期作为字符串提供,如果能够成功解析它,则返回xs:dateTime。你可以在这里找到图书馆:

https://github.com/marklogic/Corona/blob/master/corona/lib/date-parser.xqy

使用它:

import module namespace dateparser="http://marklogic.com/dateparser" at "date-parser.xqy";

dateparser:parse($filteredDocument//*:meta[@name eq "Creation_Date"]/@content)

这将允许您规范化二进制文档可以具有的各种日期格式。我会注意到不同的二进制格式(Word,PDF,JPEG等)将在创建日期使用不同的名称。因此,仅查找“Creation_Date”元数据可能会留下一些漏洞,具体取决于您在MarkLogic中存储的格式。

另请注意,如果您只想要没有时间部分的日期信息,则可以将xs:dateTime转换为xs:date。这样做会保留时区信息,这可能是一件好事。

至于你的第二个问题......

有许多不同的方法可以做到这一点,阅读一些MarkLogic文档是一个很好的起点。我建议看看:

http://docs.marklogic.com/guide/search-dev/rangequery

希望这会对您的查询需要的内容有所了解。在最简单的形式中,您可能必须首先解析用户提供的日期。这也可以通过日期解析库来完成,这样用户就可以输入大量不同的日期格式(例如:2012年11月13日,甚至是2012年11月13日的西班牙语)。然后使用该解析日期在MarkLogic中构建日期范围查询。

如果这没有帮助,我会在这里发布另一个问题,详细说明你要挂断的地方。