Браузер первого раза, когда я не ясно. Я совершенно новичок в xslt. Я пытаюсь написать функцию, которая передает список очищенных значений даты в функцию max (). Ниже приведен мой входной документ:
<dates>
<date>1990-09-02Z</date>
<date>1990-09-03Z</date>
<date>1990-09-04Z</date>
<date>1990-09-05Z</date>
<date>1990-09-06Z</date>
</dates>
Как видите, строковые значения имеют завершающий символ 'Z'. Если я пытаюсь передать их напрямую в max (), используя вложенную функцию substring ()
<xsl:template match="/dates">
<xsl:value-of select="max(xs:date(substring(//date,1,10)))"/>
</xsl:template>
, я получаю эту ошибку:
Последовательность из более чем одного элемента не разрешено в качестве первого аргумента функции fn: substring () ("1990-09-02Z", "1990-09-03Z")
, поэтому я включил объявление xsl: function в мою таблицу стилей который теперь выглядит следующим образом:
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:xs="http://www.w3.org/2001/XMLSchema"
xmlns:test="http://www.blah.blah/funct"
version="3.0">
<xsl:function name="test:funct" visibility="public">
<xsl:param name="input"/>
<xsl:sequence>
<xsl:for-each select="$input">
<xsl:value-of select="xs:date(substring(.,1,10))"/>
</xsl:for-each>
</xsl:sequence>
</xsl:function>
<xsl:template match="/dates">
<xsl:value-of select="max(test:funct(//date))"/>
</xsl:template>
</xsl:stylesheet>
Однако теперь я получаю следующую ошибку
Ошибка преобразования {1990-09-02} в число
Я думал, max () может обрабатывать даты? Я совершенно не понимаю, что передаётся в функцию max () и почему она не работает. вывод, который я ищу: 1990-09-06
Я пытаюсь прочитать документацию со спецификацией w3org, но эти термины слишком технические для меня, поэтому не имеют смысла. Спасибо за любую помощь, которую вы можете предложить.
Кстати, я использую обработчик Saxon-PE 9.8.0.12
edit: моя конечная цель - иметь таблицу стилей со списком функции, которые я могу включить в другие таблицы стилей xsl, поэтому в конечном итоге решение должно быть функцией. В этом конкретном случае c функция, которая создает список очищенных дат, который затем может быть передан max ().