2016-10-07 4 views
1

Учитывая XML:XPath 3.0 сравнить даты разностное с длительностью буквального

<?xml version="1.0" encoding="UTF-8"?> 
<root> 
    <c cid="0"> 
     <d did="c0d0" d1="2015-02-11" d2="2015-06-15" /> 
     <d did="c0d1" d1="2015-04-01" d2="2015-04-14" /> 
    </c> 
    <c cid="1"> 
     <d did="c1d0" d1="2014-11-15" d2="2015-07-21" /> 
     <d did="c1d1" d1="2016-02-10" d2="2016-02-25" /> 
    </c>  
</root> 

Использование XPath 3.0 я найти все c узлы, которая имеет по меньшей мере один d дочерний узел, который d2-d1 значений атрибутов разница меньше или равна 30 дней. d1 и d2 значения - это даты в формате YYYY-MM-DD. Я попытался XPath:

/root/c[d/xs:date(@d2)-d/xs:date(@d1)<=30]

, но у меня есть и ошибка:

Cannot compare xs:dayTimeDuration to xs:integer

Я использую XPath Builder в режиме XPath 3.0 в Oxygen XML Editor v18. Я полагаю, что эта ошибка вызвана неправильной установкой времени. Советуйте, как указать продолжительность времени как литерал в XPath 3.0. Спасибо!

ответ

2

Вы можете вычитать даты, но затем вы получите dayTimeDuration, и вам нужно сравнить с таким значением: /root/c[d[xs:date(@d2)-xs:date(@d1) <= xs:dayTimeDuration('P30D')]].

+1

И в интересах других нет ничего, что требовало XPath 3.0 - все, что вам нужно, это 2.0. –