2009-10-04 42 views
0

我有以下XML,從Web服務返回(爲猜測電影5加分):XPath的基礎上的時間來尋找元素的值

<ArrayOfSub xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns="http://tempuri.org/"> 
    <Sub> 
    <SubId>862</SubId> 
    <SubStreamId>1</SubStreamId> 
    <SubTimeStart>00:01:04.4450000</SubTimeStart> 
    <SubTimeEnd>00:01:08.2450000</SubTimeEnd> 
    <SubText>Wikus van de Merwe 
MNU Alien Affairs 

    </SubText> 
    </Sub> 
    <Sub> 
    <SubId>863</SubId> 
    <SubStreamId>1</SubStreamId> 
    <SubTimeStart>00:02:11.3430000</SubTimeStart> 
    <SubTimeEnd>00:02:14.8430000</SubTimeEnd> 
    <SubText>Sarah Livingstone 
Sociologist, Kempton Park University 

    </SubText> 
    </Sub> 
</ArrayOfSub> 

我需要滿足以下所有元素的<SubText>元素條件:

SubTimeStart < now && SubTimeEnd > now 

我這樣做的Javascript,爲Palm Pre上的WebOs應用程序。我不確定究竟什麼樣的解決方案適合我的prototype.js PeriodicExecuter,但是1/100秒似乎工作正常。

什麼XPath查詢將返回表示屏幕上現在應該顯示的元素?

+0

District 9 :) 我覺得SubTimeStart> now && now> SubTimeEnd是不可能的,因爲SubTimeStart 2009-10-04 23:56:16

+0

很好的結果,謝謝 – 2009-10-04 23:57:17

+0

你使用任何JS框架? – 2009-10-05 00:07:13

回答

1

試試這個:


var district = 9; // hint 

var now = "00:00:00.123"; // manual format is an option? 
var xpath = "/ArrayOfSub/Sub["+ 
    " SubTimeStart <= " + now + " and " + 
    " SubTimeEnd >= " + now + "]/SubText" 
 
+0

感謝Xpath,我現在想出如何評估它。自2001年以來改變很多:( – 2009-10-07 14:39:25

0

XPath確實有一些date handling functions - 儘管似乎沒有提及該列表中的毫秒數。

我想查詢將是這樣的:

nowH = 0; 
nowM = 2; 
nowS = 26; 

/ArrayOfSub/sub  //linebreaks added for readability 
    [fn:hours-from-time(SubTimeStart) <= nowH] 
    [fn:minutes-from-time(SubTimeStart) <= nowM] 
    [fn:seconds-from-time(SubTimeStart) <= nowS] 
    [fn:hours-from-time(SubTimeEnd) >= nowH] 
    [fn:minutes-from-time(SubTimeEnd) >= nowM] 
    [fn:seconds-from-time(SubTimeEnd) >= nowS] 
    /SubText 
0

XPath2支持的日期和時間,因此,如果WebOS的使用XPath2你可以做喜歡的事,很簡單:

//Sub[(SubStartTime < '00:02:13.243') and SubEndTime > '00:02:13.243'] 

否則,你可以將時間轉換爲一個簡單的整數,如下所示:

//Sub[ 
    (concat(substring(SubTimeStart,1,2), substring(SubTimeStart,4,2), substring(SubTimeStart,7)) < '000213.243') 
and 
    (concat(substring(SubTimeEnd,1,2), substring(SubTimeEnd,4,2), substring(SubTimeEnd,7)) > '000213.243') 
] 

這些查詢應該選擇第二項。