[XSL-LIST Mailing List Archive Home] [By Thread] [By Date] [Recent Entries] [Reply To This Message]

Re: Patterns and scoped variables (or rather lack th

Subject: Re: Patterns and scoped variables (or rather lack thereof)
From: abel@xxxxxxxxxx
Date: Sun, 16 Feb 2014 18:01:26 +0100 (CET)
Re:  Patterns and scoped variables (or rather lack   th
It depends whether you are using XSLT 3.0 or not, but since you mention
Let-expressions, I think you mean indeed that you are using XSLT 3.0, since
these were not available earlier.

The Pattern Syntax (see http://www.w3.org/TR/xslt-30/#pattern-syntax) clearly
allows a predicate with a Let expression. Whether or not this is already
implemented in the processor you use, I wouldn't know.

For instance, you match expression could become:

<xsl:template match="text()[
    let $t := tokenize(., ':')
    return
       count($t) eq 2 and
       count(tokenize($t, '\s+')) lt 4">

If you are not using XSLT 3.0, another approach is probably better.

Cheers,

Abel Braaksma
Exselt.net



>---- Original Message ----
>From: Ihe Onwuka <ihe.onwuka@xxxxxxxxx>
>To: "xsl-list" <xsl-list@xxxxxxxxxxxxxxxxxxxxxx>
>Sent: Zat, Feb 15, 2014, 9:42 PM
>Subject:  Patterns and scoped variables (or rather lack thereof)
>
>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.

Current Thread

PURCHASE STYLUS STUDIO ONLINE TODAY!

Purchasing Stylus Studio from our online shop is Easy, Secure and Value Priced!

Buy Stylus Studio Now

Download The World's Best XML IDE!

Accelerate XML development with our award-winning XML IDE - Download a free trial today!

Don't miss another message! Subscribe to this list today.
Email
First Name
Last Name
Company
Subscribe in XML format
RSS 2.0
Atom 0.3
Site Map | Privacy Policy | Terms of Use | Trademarks
Free Stylus Studio XML Training:
W3C Member
Stylus Studio® and DataDirect XQuery ™are products from DataDirect Technologies, is a registered trademark of Progress Software Corporation, in the U.S. and other countries. © 2004-2013 All Rights Reserved.