| Schematron | <sch:rule context="tei:*[@validUntil]">
 <sch:assert
 test="@validUntil cast as xs:date ge current-date()">
 <sch:value-of
 select="if (@ident) then concat('The ',@ident) else concat('This ',local-name(.),' 
 of ',ancestor::tei:*[@ident][1]/@ident)"/> construct is outdated (as of <sch:value-of select="@validUntil"/>); ODD processors may ignore it, and it should probably be removed</sch:assert>
 <sch:report
 test="@validUntil cast as xs:date eq current-date()">
 <sch:value-of
 select="if (@ident) then concat('The ',@ident) else concat('This ',local-name(.),' 
 of ',ancestor::tei:*[@ident][1]/@ident)"/> construct will be outdated as of tomorrow; ODD processors may then ignore it, and thus it should probably be removed soon</sch:report></sch:rule>
 <sch:rule context="tei:*[@validUntil]">
 <sch:assert
 test="(@validUntil cast as xs:date - current-date()) lt (30*xs:dayTimeDuration('P1D'))">
 <sch:value-of
 select="if (@ident) then concat('The ',@ident) else concat('This ',local-name(.),' 
 of ',ancestor::tei:*[@ident][1]/@ident)"/> construct is outdated (as of <sch:value-of select="@validUntil"/>); ODD processors may ignore it, and it should probably be removed</sch:assert>
 <sch:report
 test="@validUntil cast as xs:date eq current-date()">
 <sch:value-of
 select="if (@ident) then concat('The ',@ident) else concat('This ',local-name(.),' 
 of ',ancestor::tei:*[@ident][1]/@ident)"/> construct will be outdated as of tomorrow; ODD processors may then ignore it, and thus it should probably be removed soon</sch:report></sch:rule>
 |