Как можно сравнить две даты в формате: «Sun, 20 Jun 2010 10:45:05 GMT», используя выражение XPATH? - PullRequest
0 голосов
/ 27 декабря 2018

Пример XML:

<book>
    <item>
      <title>Book One</title> 
      <pubDate>Sun, 20 Jun 2010 10:45:05 GMT</pubDate>
    </item>
    <item>
      <title>Book Two</title> 
      <pubDate>Mon, 21 Jun 2010 11:40:03 GMT</pubDate>
    </item>
    <item>
      <title>Book Three</title> 
      <pubDate>Mon, 05 Jul 2010 10:45:05 GMT</pubDate>
    </item>
</book>

Мне нужно извлечь узлы между двумя датами, но они имеют следующий формат:

Sun, 20 Jun 2010 10:45:05 GMT

Если я попытаюсь

//book/item[pubDate > 'Sun, 20 Jun 2010 10:45:05 GMT' and pubDate < 'Mon, 05 Jul 2010 10:45:05 GMT']/title

это не работает.

1 Ответ

0 голосов
/ 08 августа 2019

Если вы хотите использовать инструмент командной строки, тогда Xidel может делать то, что вы хотите.

x-parse-dateTime :

x:parse-dateTime($input as xs:string, $format as xs:string) as xs:dateTime
Считывает дату / время из строки в заданном формате.Второй параметр $ format - это стандартный формат Pascal, в котором используется ymdhnsz (например, «yyyy-mm-dd»), а не строка изображения XQuery 3.0.

$ cat <<EOF | xidel -s - -e '//book/item[let $a:=x:parse-dateTime(substring-after(pubDate,", "),"dd mmm yyyy hh:nn:ss") return $a > dateTime("2010-06-20T10:45:05") and $a < dateTime("2010-07-05T10:45:05")]/title'
<book>
    <item>
      <title>Book One</title>
      <pubDate>Sun, 20 Jun 2010 10:45:05 GMT</pubDate>
    </item>
    <item>
      <title>Book Two</title>
      <pubDate>Mon, 21 Jun 2010 11:40:03 GMT</pubDate>
    </item>
    <item>
      <title>Book Three</title>
      <pubDate>Mon, 05 Jul 2010 10:45:05 GMT</pubDate>
    </item>
</book>
EOF

Book Two

Поскольку вы сравниваете даты и время сейчас, вы должны также ввести другие 2 как dateTime().

Обратите внимание, что x:parse-dateTime() в настоящее время работает только с английскими и немецкими строками.

...