Данный XML:XPath 3.0: выберите узлы по условию (найти максимум дочерних узлов по дате)
<?xml version="1.0" encoding="UTF-8"?>
<root>
<c cid="c0" v="100">
<d did="c00" v="0" dt="2016-01-01" />
<d did="c01" v="0" dt="2016-02-03" />
<d did="c02" v="0" dt="2016-01-15" />
</c>
<c cid="c1" v="100">
<d did="c10" v="1" dt="2016-01-01" />
<d did="c11" v="0" dt="2015-03-03" />
<d did="c12" v="0" dt="2015-04-15" />
</c>
</root>
я должен найти XPath 2.0 или 3.0, который будет возвращать мне список c
узлов с помощью выражения: найти максимум d
узел этого c
детей по атрибуту dt
(проанализируйте его как date
), и если его значение атрибута v
равно «0», верните узел c
.
Я ожидаю получить один узел c
(с @ cid = "c0") в результате, потому что /root/c[cid="c1"]/d[@dt="2016-01-01"]/@v
не равно 0 (равно 1).
Я застрял на этом XPath ГНФАР:
/root/c[d[max(xs:date(@dt))]/@v="0"]
Это дает мне ошибку (я использую Oxygen XML Editor, XPath 3.0):
XPath не удалось из-за: Эффективное булево значение не определено для последовательности, начиная с атомным значением, отличным от булевой, номер, строки или URI
Я полагаю, что это связано с неправильным использованием функции max
, но не может заставить ее работать.
ОБНОВЛЕНИЕ:
- Давайте предположим, что
c
узлы будут иметьd
детей с уникальным максимальным значением ихdt
атрибутов. Я также попытался XPath 3.0 выражение:
/root/c[d[@dt=max(.//@dt/xs:date(.))]/@v="0"]
но он вернулся мне все узлы (неверный результат).
Что делать, если узел c будет иметь более одного узла d с таким же максимальным значением атрибута dt и разными значениями атрибутов v? –