Мне нравится ответ Альхандро, но в случае, если кто-то настаивает на использовании более высокой версии XSLT и действительно рассматривает значения как значения year , month , день месяца , часы , минуты и секунды , тогда можно использовать что-то подобное ниже,
Это преобразование может выглядеть немного сложнее, но оно обрабатывает дочерние элементы как значения этих типизированных объектов и выдает ошибку, если встречается недопустимое значение компонента, например Feb * 1019. * 30-е, месяц : 13, час : 25 или минута / секунда 61
<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:xs="http://www.w3.org/2001/XMLSchema">
<xsl:output omit-xml-declaration="yes" indent="yes"/>
<xsl:template match="@*|node()">
<xsl:copy>
<xsl:apply-templates select="@*|node()"/>
</xsl:copy>
</xsl:template>
<xsl:template match="root">
<xsl:copy>
<xsl:copy-of select="@*"/>
<xsl:apply-templates select="entry">
<xsl:sort select="employeeNumber" data-type="number"/>
<xsl:sort select=
"xs:dateTime(concat(
string-join(
(
format-number(bookingtime/year, '0000'),
format-number(bookingtime/month, '00'),
format-number(bookingtime/day, '00')
), '-'
),
'T',
string-join(
(
format-number(bookingtime/hours, '00'),
format-number(bookingtime/minutes, '00'),
format-number(bookingtime/seconds, '00')
), ':'
)
)
)"/>
</xsl:apply-templates>
</xsl:copy>
</xsl:template>
</xsl:stylesheet>
Когда это преобразование применяется к предоставленному исходному XML-документу :
<root>
<entry>
<employeeName>Bob the Builder</employeeName>
<employeeNumber>00290035</employeeNumber>
<requestCode>g</requestCode>
<bookingtime>
<year>2019</year>
<month>3</month>
<day>18</day>
<hours>14</hours>
<minutes>52</minutes>
<seconds>0</seconds>
</bookingtime>
</entry>
<entry>
<employeeName>Bob the Builder</employeeName>
<employeeNumber>00290035</employeeNumber>
<requestCode>c</requestCode>
<bookingtime>
<year>2018</year>
<month>3</month>
<day>18</day>
<hours>14</hours>
<minutes>22</minutes>
<seconds>0</seconds>
</bookingtime>
</entry>
<entry>
<employeeName>Mike Zeh</employeeName>
<employeeNumber>00200060</employeeNumber>
<requestCode>c</requestCode>
<bookingtime>
<year>2019</year>
<month>3</month>
<day>17</day>
<hours>10</hours>
<minutes>15</minutes>
<seconds>0</seconds>
</bookingtime>
</entry>
</root>
желаемый, правильный результат выдается :
<root>
<entry>
<employeeName>Mike Zeh</employeeName>
<employeeNumber>00200060</employeeNumber>
<requestCode>c</requestCode>
<bookingtime>
<year>2019</year>
<month>3</month>
<day>17</day>
<hours>10</hours>
<minutes>15</minutes>
<seconds>0</seconds>
</bookingtime>
</entry>
<entry>
<employeeName>Bob the Builder</employeeName>
<employeeNumber>00290035</employeeNumber>
<requestCode>c</requestCode>
<bookingtime>
<year>2018</year>
<month>3</month>
<day>18</day>
<hours>14</hours>
<minutes>22</minutes>
<seconds>0</seconds>
</bookingtime>
</entry>
<entry>
<employeeName>Bob the Builder</employeeName>
<employeeNumber>00290035</employeeNumber>
<requestCode>g</requestCode>
<bookingtime>
<year>2019</year>
<month>3</month>
<day>18</day>
<hours>14</hours>
<minutes>52</minutes>
<seconds>0</seconds>
</bookingtime>
</entry>
</root>