Попробуйте указать $date
как фактическую дату/время:
let $date:= xs:dateTime($item/pubDate/text())
Если формат даты/времени согласован, вы можете реализовать свой собственный конвертер. Две части, которые доставят вам больше всего проблем, в примере из вашего комментария, это месяц и часовой пояс. Месяц должен быть числовым, и вам нужно будет преобразовать часовой пояс в эквивалентное смещение UTC.
Вот пример:
declare variable $months := ('jan','feb','mar','apr','may','jun','jul','aug','sep','oct','nov','dec');
declare variable $timezoneMap :=
<map>
<tz>
<numeric>-05:00</numeric>
<alpha>est</alpha>
</tz>
</map>;
declare function local:formatDate($origdate as xs:string) as xs:dateTime {
let $dateTokens := tokenize($origdate,' ')
let $timezone := $timezoneMap/tz[lower-case($dateTokens[6])=alpha]/numeric/text()
let $month := string(index-of($months,lower-case($dateTokens[3])))
let $newDate := concat($dateTokens[4],'-',if (string-length($month)=1) then concat('0',$month) else $month,'-',$dateTokens[2],
'T',$dateTokens[5],$timezone)
return
xs:dateTime($newDate)
};
Затем вы можете использовать функцию следующим образом:
let $date:= local:formatDate($item/pubDate)
Кроме того, если вы используете XQuery 3.0, вы можете использовать карты. для часового пояса и месяца:
declare namespace map = "http://www.w3.org/2005/xpath-functions/map";
declare variable $months := map{"jan":="01","feb":="02","mar":="03","apr":="04","may":="05","jun":="06",
"jul":="07","aug":="08","sep":="09","oct":="10","nov":="11","dec":="12"};
declare variable $timezoneMap := map{"est":="-05:00"};
declare function local:formatDate($origdate as xs:string) as xs:dateTime {
let $dateTokens := tokenize($origdate,' ')
let $newDate := concat($dateTokens[4],'-',$months(lower-case($dateTokens[3])),'-',$dateTokens[2],
'T',$dateTokens[5],$timezoneMap(lower-case($dateTokens[6])))
return
xs:dateTime($newDate)
};
person
Daniel Haley
schedule
10.01.2013