Subject: RE: [xsl] sequence of strings From: "Michael Kay" <mike@xxxxxxxxxxxx> Date: Tue, 2 Dec 2008 13:58:07 -0000 |
A couple of things come to mind: > <xsl:template name='get_attributes'> > <xsl:param name='string' select='zip'/> > <xsl:variable name='blip' > as='xs:string*' > select="for $h in ('bold', 'italic') return > if (contains($string, $h)) then $h > else ()"/> > <xsl:sequence select="for $h in $blip return if ($h = > 'bold') then > 'BLD' else > if ($h = 'italic') then 'ITA' > else ()" /> > </xsl:template> I would tend to write that as <xsl:function name="get-attributes" as="xs:string*"> <xsl:param name="string" as="xs:string"/> <xsl:sequence select="'BLD'[contains($string, 'bold')], 'ITA'[contains($string, 'italic')]"/> </xsl:function> or if it were a longer list of names then <xsl:variable name="styles" as="element(style)"> <style name="BLD" code="bold"/> <style name="ITA" code="italic"/> </xsl:variable> <xsl:function name="get-attributes" as="xs:string*"> <xsl:param name="string" as="xs:string"/> <xsl:sequence select="$styles[contains($string, @code)]/@name"/> </xsl:function> Either way, this: > <xsl:variable name='blop' as='xs:string*'> > <xsl:call-template name='get_attributes'> > <!-- make sequence of strings --> > <xsl:with-param name='string' > select='"style: italic;bold"'/> > </xsl:call-template> > </xsl:variable> becomes <xsl:variable name="blop" as="xs:string*" select="get-attributes('style: italic;bold')"/> I don't think there's much you can do about the main recursive template (name="nest"). Michael Kay http://www.saxonica.com/ > -----Original Message----- > From: Ruud Grosmann [mailto:r.grosmann@xxxxxx] > Sent: 02 December 2008 13:18 > To: xsl-list@xxxxxxxxxxxxxxxxxxxxxx > Subject: [xsl] sequence of strings > > hi group, > > I have made a test style sheet to examine how I can use a > string value to create nested elements (xslt2, saxon9). > The string contains one or more style descriptors; the needed > elements have a different name than the corresponding styles. > > My strategy is to convert the string to a sequence of > relevant substrings and then to map the sequence to the right > element name. > > Below I have pasted my stylesheet. For the input document > > <root/> > > it creates the expected output > > <?xml version="1.0" encoding="utf-8"?> > <document> > <BLD> > <ITA/> > </BLD> > </document> > > My question is: this solution looks clumsy. How can I improve > it? My focus is not on the nest-template itself, but on the > get_attributes-template and the calling of the nest-template > (is the extra blop variable needed?)... > > thanks in advance, Ruud > > > <?xml version="1.0" encoding="UTF-8"?> > <!-- maak een stack van strings --> > > <xsl:stylesheet version="2.0" > xmlns:xsl="http://www.w3.org/1999/XSL/Transform" > xmlns:xs="http://www.w3.org/2001/XMLSchema" > exclude-result-prefixes="xs"> > > <xsl:output method="xml" version="1.0" encoding="utf-8" > indent="yes"/> > > <xsl:template match="/root"> > <xsl:variable name='blop' as='xs:string*'> > <xsl:call-template name='get_attributes'> > <!-- make sequence of strings --> > <xsl:with-param name='string' > select='"style: italic;bold"'/> > </xsl:call-template> > </xsl:variable> > > <document> > <xsl:call-template name='nest'> > <xsl:with-param name='lijst' select='$blop'/> > </xsl:call-template> > </document> > </xsl:template> > > <xsl:template name='nest'> > <xsl:param name='lijst' select='zip'/> > <xsl:choose> > <xsl:when test="empty($lijst)"> > <!-- end recursion --> > <xsl:sequence select="()"/> > </xsl:when> > <xsl:otherwise> > <xsl:element name="{$lijst[1]}"> > <xsl:call-template name='nest'> > <xsl:with-param name='lijst' > select='$lijst[position() != 1]'/> > </xsl:call-template> > </xsl:element> > </xsl:otherwise> > </xsl:choose> > </xsl:template> > > <xsl:template name='get_attributes'> > <xsl:param name='string' select='zip'/> > <xsl:variable name='blip' > as='xs:string*' > select="for $h in ('bold', 'italic') return > if (contains($string, $h)) then $h > else ()"/> > <xsl:sequence select="for $h in $blip return if ($h = > 'bold') then > 'BLD' else > if ($h = 'italic') then 'ITA' > else ()" /> > </xsl:template>
Current Thread |
---|
|
<- Previous | Index | Next -> |
---|---|---|
[xsl] sequence of strings, Ruud Grosmann | Thread | Re: [xsl] sequence of strings, Ruud Grosmann |
[xsl] sequence of strings, Ruud Grosmann | Date | Re: [xsl] sequence of strings, Florent Georges |
Month |