Re: [xsl] Different Behavior for Regex in XSD and XSLT/XQuery

Subject: Re: [xsl] Different Behavior for Regex in XSD and XSLT/XQuery
From: "David Carlisle d.p.carlisle@xxxxxxxxx" <xsl-list-service@xxxxxxxxxxxxxxxxxxxxxx>
Date: Wed, 10 Jan 2018 16:39:47 -0000
On 10 January 2018 at 16:15, Eliot Kimber ekimber@xxxxxxxxxxxx
<xsl-list-service@xxxxxxxxxxxxxxxxxxxxxx> wrote:
> I have this simple type in an XSD, which is my attempt to validate strings
that are subsets of the string representation of xs:time values:
>
>   <xs:simpleType name="timestr">
>     <xs:restriction base="xs:string">
>       <xs:pattern
value="(\d|0\d|1\d|2[0123])(:([0-5]\d|60)(:([0-5]\d|60))?)?|24(:00(:00)?)?"/>
>     </xs:restriction>
>   </xs:simpleType>
>
> And it correctly rejects "05:96" as invalid.
>
> However, using the same regex with start/end anchors added in matches() it
does not reject "05:96".
>
> This transform:
>
>   <xsl:template match="/">
>     <xsl:variable name="timestr" as="xs:string"
>       select="'05:96'"
>     />
>     <xsl:variable name="is-valid" as="xs:boolean"
>       select="matches($timestr,
'^(\d|0\d|1\d|2[0123])(:([0-5]\d|60)(:([0-5]\d|60))?)?|24(:00(:00)?)?$')"
>     />
>     <result>
>       <is-valid><xsl:value-of select="$timestr"/>, <xsl:value-of
select="$is-valid"/></is-valid>
>     </result>
>   </xsl:template>o;?
>
> Produces:
>
>  <result><is-valid>05:96, true</is-valid></result>
>
> From Saxon 9.7. MarkLogic 9 XQuery gives the same result.
>
> My question: why am I not getting the same behavior from the XSD validator
and XPath processors for this regular expression?
>
> Thanks,
>
> Eliot
>
> --Eliot Kimber
> http://contrext.com
>
>

you want

matches($timestr,
'^((\d|0\d|1\d|2[0123])(:([0-5]\d|60)(:([0-5]\d|60))?)?|24(:00(:00)?)?)$')"

as otherwise the $ only applies to one of the | choices.

David

Current Thread