2009-10-04 43 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') 
] 

这些查询应该选择第二项。