Итак, у вас есть строка ввода вида 20181011154000 +0200
, в которую вы хотите преобразовать XSLT / XPath 2.0 xs:date
или xs:dateTime
?Я полагаю, что в 2018-10-11T15:40:00+02:00
, если у вас есть согласованный формат, вы можете использовать функцию replace
, чтобы создать правильный формат для xs:dateTime
с, например,
xs:dateTime(replace('20181011154000 +0200', '([0-9]{4})([0-9]{2})([0-9]{2})([0-9]{2})([0-9]{2})([0-9]{2})\s([+-])([0-9]{2})([0-9]{2})', '$1-$2-$3T$4:$5:$6$7$8:$9'))
Таким образом, вы можете написать функцию
<xsl:function name="mf:date-time-string-to-dateTime" as="xs:dateTime">
<xsl:param name="input" as="xs:string"/>
<xsl:sequence select="xs:dateTime(replace($input, '([0-9]{4})([0-9]{2})([0-9]{2})([0-9]{2})([0-9]{2})([0-9]{2})\s([+-])([0-9]{2})([0-9]{2})', '$1-$2-$3T$4:$5:$6$7$8:$9'))"/>
</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:mf="http://example.com/mf"
exclude-result-prefixes="#all"
expand-text="yes"
version="3.0">
<xsl:mode on-no-match="shallow-copy"/>
<xsl:function name="mf:date-time-string-to-dateTime" as="xs:dateTime">
<xsl:param name="input" as="xs:string"/>
<xsl:sequence select="xs:dateTime(replace($input, '([0-9]{4})([0-9]{2})([0-9]{2})([0-9]{2})([0-9]{2})([0-9]{2})\s([+-])([0-9]{2})([0-9]{2})', '$1-$2-$3T$4:$5:$6$7$8:$9'))"/>
</xsl:function>
<xsl:output method="html" indent="yes" html-version="5"/>
<xsl:template match="programme">
<p>Start {mf:date-time-string-to-dateTime(@start)}, end {mf:date-time-string-to-dateTime(@stop)}</p>
</xsl:template>
</xsl:stylesheet>
https://xsltfiddle.liberty -development.net / eiZQaG4