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

Subject: Re: [xsl] Different Behavior for Regex in XSD and XSLT/XQuery
From: "Peter West lists@xxxxxxxxx" <xsl-list-service@xxxxxxxxxxxxxxxxxxxxxx>
Date: Thu, 11 Jan 2018 02:20:28 -0000
Eliot,

I havenbt played with REs for a long time, so forgive my naivety, but why
the b60bs?

--
Peter West
pbw@xxxxxxxxx <mailto:pbw@xxxxxxxxx>
bBut you have made it a den of robbers.b

> On 11 Jan 2018, at 2:53 am, Eliot Kimber ekimber@xxxxxxxxxxxx
<xsl-list-service@xxxxxxxxxxxxxxxxxxxxxx> wrote:
>
> Doh! A subtle but should-be-obvious syntax detail.
>
> Thanks,
>
> Eliot
>
> --
> Eliot Kimber
> http://contrext.com
>
>
> o;?On 1/10/18, 10:39 AM, "David Carlisle d.p.carlisle@xxxxxxxxx"
<xsl-list-service@xxxxxxxxxxxxxxxxxxxxxx> wrote:
>
>    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