xsl-list
[Top] [All Lists]

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

2018-01-10 10:39:52
On 10 January 2018 at 16:15, Eliot Kimber ekimber(_at_)contrext(_dot_)com
<xsl-list-service(_at_)lists(_dot_)mulberrytech(_dot_)com> 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>

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
--~----------------------------------------------------------------
XSL-List info and archive: http://www.mulberrytech.com/xsl/xsl-list
EasyUnsubscribe: http://lists.mulberrytech.com/unsub/xsl-list/1167547
or by email: xsl-list-unsub(_at_)lists(_dot_)mulberrytech(_dot_)com
--~--

<Prev in Thread] Current Thread [Next in Thread>