嘗試鑄造$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,你可以使用maps的時區和月:
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)
};
看起來你需要解析dateTime。幾個API具有內置的這些類型的函數:MarkLogic,Java,.NET等,因此您必須決定是否要在XQuery之外解析dateTime或在XQuery中從頭開始編寫dateTime,在這種情況下應該可能是一個不同的問題。 – wst
您使用的是什麼版本? –
@Ranon我可以使用版本3.0和版本1.0,因爲兩個版本都支持eXist數據庫版本2.0我認爲...現在我使用1.0來滿足我的需求 – user1598696