Если ваш запрос не поддерживает схему, атрибут @endDate (после атомизации) будет иметь вид xs: untypedAtomic, а функция max () попытается преобразовать значения xs: untypedAtomic в даты.Вы должны указать обработчику запросов обрабатывать значения как даты, что вы можете сделать либо с учетом схемы запроса, либо (проще) с помощью явного приведения:
fn:max($SA_INFO_LISTRow/@EndDate/xs:date(.))
Однако естьдругие проблемы с вашим запросом.Это условие:
if (($SA_INFO_LISTRow/@SP_TYPE_CD) and fn:max($SA_INFO_LISTRow/@EndDate))
(когда исправлено) просто спрашивает, существует ли максимальная дата, и если вообще есть какие-либо даты, тогда будет максимальный, так что это довольно бессмысленно.
Кроме того, вы говорите, что ищете записи, где @SP_TYPE_CD не равен "", но ваш код ищет все записи, где существует этот атрибут, независимо от его значения.
Я предполагаючто вы на самом деле хотите, чтобы максимальная дата окончания всех записей, где @SP_TYPE_CD не равно "", и это будет (заменяя весь ваш запрос)
<ns1:date>
{max(//SA_INFO_LISTRow[@SP_TYPE_CD != '']/@EndDate/xs:date(.))}
</ns1:date>