Subject: Re: [xsl] Patterns and scoped variables (or rather lack thereof) From: Ihe Onwuka <ihe.onwuka@xxxxxxxxx> Date: Wed, 19 Feb 2014 09:34:35 +0000 |
I see, you eliminate the multiple tokenize calls by encapsulating the logic in a function which is called in the pattern. Nice. On Mon, Feb 17, 2014 at 5:15 PM, Wendell Piez <wapiez@xxxxxxxxxxxxxxx> wrote: > Ihe, > > I will sometimes resort to stylesheet functions to provide > encapsulation of logic like this. > > So (designed to return nothing when the input doesn't show two values > when tokenized on the colon): > > <xsl:function name="ihe:colon-delimited-label" as="xs:string()?"> > <xsl:param name="field" as="node()"/> > <xsl:variable name="split-on-colon" select="tokenize($field,'\s*:\s*')"/> > <xsl:if test="count($split-on-colon) eq 2"> > <xsl:sequence select="$split-on-colon[1]"/> > <xsl:if> > </xsl:function> > > So > > <xsl:template match="text()[count(tokenize(ihe:colon-delimited-label(.)),'\s*') > le 3]"> > ... > > I hope that helps, > Wendell > > > On Sat, Feb 15, 2014 at 3:42 PM, Ihe Onwuka <ihe.onwuka@xxxxxxxxx> wrote: >> Transforming this sort of markup >> >> <div class="fr small subtle">Transaction date: Sep 26, 2013</div> >> >> into a key value pair. >> >> <Transactiondate>Sep 26, 2013</Transactiondate> >> >> However if there are too many words before the colon separator (the >> key part) then it probably isn't suitable for the key value treatment >> (the code below uses 3 words as the cutoff point). >> >> Talking of the code below and the thread title, the issue is how many >> times I've had to (or think I've had to ) tokenize the string on colon >> because I cannot (or think I cannot) introduce a let scoped variable >> into the pattern. >> >> >> <xsl:template match="text()[count(tokenize(.,':')) eq 2 and >> count(tokenize(tokenize(.,':')[1],'\s+')) lt 4]"> >> >> <xsl:variable name="keyValue" select="tokenize(.,':')"/> >> >> <xsl:element name="{replace($keyValue[1],'\s+','')}"> .....key..... >> <xsl:value-of select="$keyValue[2]"/> >> ......value..... >> </xsl:element> >> >> </xsl:template> >> >> How else do I think I could do this. >> >> <xsl:template match="text()"> >> <xsl:call-template name="dealWithText" >> </xsl:template> >> >> <xsl:template name="dealWithText"> >> <xsl:variable name="keyValue" select=tokenize ...etc> >> <xsl:choose> >> <xsl:when etc >> >> which of course camouflages the matchng rule inside the call template. >> >> Is this the best that can be done or have I missed something. >> > > > > -- > Wendell Piez | http://www.wendellpiez.com > XML | XSLT | electronic publishing > Eat Your Vegetables > _____oo_________o_o___ooooo____ooooooo_^
Current Thread |
---|
|
<- Previous | Index | Next -> |
---|---|---|
Re: [xsl] Patterns and scoped varia, Wendell Piez | Thread | Re: [xsl] Patterns and scoped varia, Wendell Piez |
Re: [xsl] Patterns and scoped varia, Wendell Piez | Date | [xsl] A few gems from Michael Kay's, Costello, Roger L. |
Month |