Поскольку вы добавили тег для XSLT 3, я думаю, что вы можете избавиться от любого вызова Java и просто использовать, например,
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:xs="http://www.w3.org/2001/XMLSchema"
xmlns:mf="http://example.com/mf"
exclude-result-prefixes="#all"
version="3.0">
<xsl:function name="mf:get-dateTime" as="xs:dateTime?">
<xsl:param name="date" as="xs:string"/>
<xsl:param name="hours" as="xs:string"/>
<xsl:param name="minutes" as="xs:string"/>
<xsl:try
select="xs:dateTime(replace($date, '([0-9]{2})/([0-9]{2})/([0-9]{4})', '$3-$2-$1') || 'T' || $hours || ':' || $minutes || ':00')">
<xsl:catch select="()"/>
</xsl:try>
</xsl:function>
<xsl:param name="now" select="current-dateTime()"/>
<xsl:output method="json" indent="yes"/>
<xsl:template match="activeMessage">
<xsl:sequence
select="map {
'message' : array {
message[mf:get-dateTime(displayScheduleContainer/startDate, displayScheduleContainer/startTimeHrs, displayScheduleContainer/startTimeMins) lt $now
and
mf:get-dateTime(displayScheduleContainer/endDate, displayScheduleContainer/endTimeHrs, displayScheduleContainer/endTimeMins) gt $now]/messageText[normalize-space()]/string()
}
}"/>
</xsl:template>
</xsl:stylesheet>
в XSLT 3 с Saxon 9.8 или новее.Я не уверен в том, какой именно выходной формат JSON вам нужен, но главное преимущество XSLT 3 состоит в том, что вы можете создавать карты и массивы в XSLT / XPath, и при необходимости они сериализуются как JSON, не беспокоясь о том, чтобы выводить запятые в нужном месте..
https://xsltfiddle.liberty -development.net / bnnZWx / 1
Вероятно, было бы лучше перенести два сравнения дат в другую функцию, так как тогда предикатстановится более читабельным:
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:xs="http://www.w3.org/2001/XMLSchema"
xmlns:mf="http://example.com/mf"
exclude-result-prefixes="#all"
version="3.0">
<xsl:function name="mf:get-dateTime" as="xs:dateTime?">
<xsl:param name="date" as="xs:string"/>
<xsl:param name="hours" as="xs:string"/>
<xsl:param name="minutes" as="xs:string"/>
<xsl:try
select="xs:dateTime(replace($date, '([0-9]{2})/([0-9]{2})/([0-9]{4})', '$3-$2-$1') || 'T' || $hours || ':' || $minutes || ':00')">
<xsl:catch select="()"/>
</xsl:try>
</xsl:function>
<xsl:function name="mf:compare-dates" as="xs:boolean">
<xsl:param name="schedule" as="element(displayScheduleContainer)"/>
<xsl:sequence
select="mf:get-dateTime($schedule/startDate, $schedule/startTimeHrs, $schedule/startTimeMins) lt $now
and
mf:get-dateTime($schedule/endDate, $schedule/endTimeHrs, $schedule/endTimeMins) gt $now"/>
</xsl:function>
<xsl:param name="now" select="current-dateTime()"/>
<xsl:output method="json" indent="yes"/>
<xsl:template match="activeMessage">
<xsl:sequence
select="map {
'message' : array {
message[mf:compare-dates(displayScheduleContainer)]/messageText[normalize-space()]/string()
}
}"/>
</xsl:template>
</xsl:stylesheet>
https://xsltfiddle.liberty -development.net / bnnZWx / 2