Re: [xsl] analyze-string regex

Subject: Re: [xsl] analyze-string regex
From: "Imsieke, Gerrit, le-tex" <gerrit.imsieke@xxxxxxxxx>
Date: Wed, 26 Mar 2014 21:54:40 +0100
Hi Peter,

You probably need to make all of the .* in the regex non-greedy (and restore flags="s").

Gerrit

On 26.03.2014 21:30, Rushforth, Peter wrote:
Hi,

I am trying to use xsl:analyze-string to process a json response, the model of which is fixed.

The target environment is saxon-ce, but I am using oxygen to get things working.

I was under the impression that the regex would perform multiple matches, allowing me to generate a sequence of elements from a string containing multiple objects that I match. If that is true (the spec says it should be, I think), then my regex is faulty. Could you offer any suggestions about the following, please?

When I use dot-all mode (@flags="s"), I get a single <option> corresponding to the last object in the array. When no flags, an empty sequence. Any suggestions appreciated.

My objective is to generate a sequence of <option> elements matching the json objects:

xslt:

<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"; xmlns:ex="http://example.org/namespace"; exclude-result-prefixes="ex">
   <xsl:output method="xml" omit-xml-declaration="yes"/>
   <xsl:template match="json">
     <datalist>
       <xsl:copy-of select="ex:json2Options(.)"/>
     </datalist>
   </xsl:template>
   <xsl:function name="ex:json2Options">
     <xsl:param name="json"/><!--           1       2                   3             4                              5                       6               7                        8            9              -->
     <xsl:variable name="regexps" select="'(\{.*(&quot;title&quot;:.*&quot;(.*?)&quot;).*(&quot;qualifier&quot;:.*&quot;(.*?)&quot;).*(&quot;type&quot;:.*&quot;(.*?)&quot;).*(&quot;geometry&quot;:.*(\{.*?\})).*\}{1,})'"/>
     <xsl:analyze-string select="$json" regex="{$regexps}">
       <xsl:matching-substring>
         <xsl:element name="option">
           <xsl:attribute name="data-title" select="regex-group(3)"></xsl:attribute>
           <xsl:attribute name="data-qualifier" select="regex-group(5)"/>
           <xsl:attribute name="data-type" select="regex-group(7)"/>
           <xsl:attribute name="data-geometry" select="regex-group(9)"/>
           <xsl:value-of select="regex-group(3)"/>
         </xsl:element>
       </xsl:matching-substring>
     </xsl:analyze-string>
   </xsl:function>
</xsl:stylesheet>

Input document:

<json>
[
{
     "title": "Ottawa, Carleton, Ontario (Unincorporated area)",
     "qualifier": "LOCATION",
     "type": "Geoname",
     "bbox": [-75.6903367156744, 45.373570070138, -75.6524412843256, 45.427540929862],
     "geometry": {"type":"Point","coordinates":[-75.671387,45.400555]}
},
{
     "title": "Ottawa, Carleton; Russell, Ontario (City)",
     "qualifier": "LOCATION",
     "type": "Geoname",
     "bbox": [-76.3555857, 44.9617738, -75.2465783, 45.5376514],
     "geometry": {"type":"Point","coordinates":[-75.58429,45.333389]}
},
{
     "title": "031G OTTAWA",
     "qualifier": "LOCATION",
     "type": "NTS",
     "bbox": [-76.0, 45.0, -74.0, 46.0],
     "geometry": {"type":"Point","coordinates":[-75,45.5]}
}]</json>


Cheers, and thanks, Peter Rushforth


-- Gerrit Imsieke GeschC$ftsfC<hrer / Managing Director le-tex publishing services GmbH Weissenfelser Str. 84, 04229 Leipzig, Germany Phone +49 341 355356 110, Fax +49 341 355356 510 gerrit.imsieke@xxxxxxxxx, http://www.le-tex.de

Registergericht / Commercial Register: Amtsgericht Leipzig
Registernummer / Registration Number: HRB 24930

GeschC$ftsfC<hrer: Gerrit Imsieke, Svea Jelonek,
Thomas Schmidt, Dr. Reinhard VC6ckler

Current Thread