Close

Deal with empty DateTime in XSD and XSLT

In this specific case I received data from an AS400 system. In the request body are metadata with a field DATIME. An empty DATIME can be received from AS400, but the output of the XSLT must always have a valid datetime, even if not specified.

First let’s look at the correct XSD. Remember: DateTime can be filled or an empty string:

<xs:element name="Meta">
	<xs:element name="DATIME" type="emptyDate"/>

<xs:simpleType name="emptyDate">
	<xs:union memberTypes="xs:dateTime">
	<xs:simpleType>
		<xs:restriction base="xs:string">
			<xs:enumeration value=""/>
		</xs:restriction>
	</xs:simpleType>
	</xs:union>
</xs:simpleType>

Next the XSLT that sets Enqueued_Time to either the input datetime or the current datetime if empty:

<Relatie>
...
<Enqueued_Time>
<xsl:choose>
	<xsl:when test="MSP_REQUEST_BODY/Meta/DATIME/text() != ''">
		<xsl:value-of select="MSP_REQUEST_BODY/Meta/DATIME/text()"/>
	</xsl:when>
	<xsl:otherwise>
		<xsl:value-of select="userCSharp:DateNow()"/>
	</xsl:otherwise>
</xsl:choose>
</Enqueued_Time>
</Relatie>

<msxsl:script language="C#" implements-prefix="userCSharp">
public string DateNow() 
{ 
	return(DateTime.Now.ToString("yyyy-MM-ddTHH:mm:ss", System.Globalization.CultureInfo.InvariantCulture)); 
}