XPath для поиска элементов на основе значений времени - PullRequest
0 голосов
/ 05 октября 2009

У меня есть следующий XML-код, возвращенный веб-службой (5 дополнительных баллов за отгадывание фильма):

<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, для приложения WebOs на Palm Pre. Я не уверен, какое именно разрешение подходит для моего prototype.js PeriodicExecuter, но 1/100 секунды работает нормально.

Какой запрос XPath вернет элемент, представляющий то, что должно быть на экране прямо сейчас?

Ответы [ 3 ]

1 голос
/ 05 октября 2009

Попробуйте это:


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 голосов
/ 05 октября 2009

XPath2 поддерживает дату и время, поэтому, если WebO использует 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')
]

Эти запросы должны выбрать второй элемент.

0 голосов
/ 05 октября 2009

XPath имеет некоторые функции обработки даты - хотя в этом списке нет упоминаний о миллисекундах.

Полагаю, запрос будет выглядеть примерно так:

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
...