$date
実際の日付/時刻としてキャストしてみてください。
let $date:= xs:dateTime($item/pubDate/text())
日付/時刻の形式が一貫している場合は、独自のコンバーターを実装できます。あなたのコメントの例で、最も問題を引き起こす2つの部分は、月とタイムゾーンです。月は数値である必要があり、タイムゾーンを同等の 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)
};