fn:analyze-string also works. It looks like the code that is processing the matches is getting confused in setting up the group context for regex-group for some reason.
//Mary On Mon, 08 Sep 2014 06:45:20 -0700, David Lee <[email protected]> wrote: > A quick test with XQuery , fn:replace doesn’t show the problem > > fn:replace('2004XY2006', '(\d\d\d\d)xy(\d\d\d\d)', "$1 and $2" , "i" ) > -> "2004 and 2006" > > So this looks xslt specific > > -----Original Message----- > From: [email protected] > [mailto:[email protected]] On Behalf Of David > Sewell > Sent: Monday, September 08, 2014 9:20 AM > To: "neil bradley"; MarkLogic Developer Discussion > Subject: Re: [MarkLogic Dev General] xsl:analyze-string grouping bug? > > I can confirm that this bug is evident in my installation of Marklogic > (7.0-3). > And a quick sanity check of the data + XSLT using Saxon produces the > expected output values inside <Date>. Can you file a bug report on ML's > support site? If not and if no one from MarkLogic posts in response, > I'll do that later today. > > David > > On Mon, 8 Sep 2014, "neil bradley" wrote: > >> Hi, >> >> I think there is a bug in the MarkLogic implementation of the >> <xsl:analyze-string> element. >> >> It seems that you cannot have more than one character between regex >> groups. >> >> My original issue was date ranges, where there could be a “-“ or “- “ >> between the dates, and wasted some some investigating hyphens in >> character classes. >> >> But the problem occurs with ANY two characters, even if I know the >> exact order. So, if the dates were going to be formatted like this: >> >> <Dates>2004xy2006</Dates> >> >> Then it still fails when I try this: >> >> <xsl:template match="Dates"> >> <xsl:variable name="inputString"><xsl:value-of >> select="."/></xsl:variable> <xsl:choose> >> <xsl:when test="matches($inputString, '(\d\d\d\d)xy(\d\d\d\d)', >> 'i')"> >> <xsl:analyze-string select="$inputString" >> regex="(\d\d\d\d)xy(\d\d\d\d)" flags="i"> >> <xsl:matching-substring> >> <Dates> >> <Date><xsl:value-of select="regex-group(1)"/></Date> >> <Date><xsl:value-of select="regex-group(2)"/></Date> >> </Dates> >> </xsl:matching-substring> >> </xsl:analyze-string> >> </xsl:when> >> </xsl:choose> >> </xsl:template> >> >> The matches() function works fine, but the second <Date> element in >> the output is empty. So the regex attribute is not working correctly. >> >> The problem cannot be avoided by using a character class [...] *, or >> even by adding + or* to a single character! >> >> Incidentally, it does recover thereafter. So, if there is a third >> group, then that will be output correctly. >> >> Of course, the solution is to just make the intermediate characters >> into a group too, even though I don’t want that group. But I still >> think this is a bug that is worth noting. >> >> Neil. >> _______________________________________________ >> General mailing list >> [email protected] >> http://developer.marklogic.com/mailman/listinfo/general > > -- > David Sewell, Editorial and Technical Manager ROTUNDA, The University of > Virginia Press PO Box 400314, Charlottesville, VA 22904-4314 USA > Email: [email protected] Tel: +1 434 924 9973 > Web: http://rotunda.upress.virginia.edu/ > _______________________________________________ > General mailing list > [email protected] > http://developer.marklogic.com/mailman/listinfo/general -- Using Opera's revolutionary email client: http://www.opera.com/mail/ _______________________________________________ General mailing list [email protected] http://developer.marklogic.com/mailman/listinfo/general
