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

Re: Filtering on a tokenized list

Subject: Re: Filtering on a tokenized list
From: "Mukul Gandhi gandhi.mukul@xxxxxxxxx" <xsl-list-service@xxxxxxxxxxxxxxxxxxxxxx>
Date: Fri, 24 Feb 2017 06:24:23 -0000
Re:  Filtering on a tokenized list
I played with your use case, and I think you need something like below:

XML document
<?xml version="1.0" encoding="UTF-8"?>
<X colwidth="0.439in 1.845in"/>

XSLT program
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"

    <xsl:output method="text"/>

    <xsl:template match="X">
        <xsl:variable name="nums" select="tokenize(@colwidth,'\s+')"/>
        <xsl:for-each select="$nums">
            <xsl:value-of select="substring-before(., 'in')"/>


On 23 February 2017 at 18:19, Rick Quatro rick@xxxxxxxxxxxxxx <
xsl-list-service@xxxxxxxxxxxxxxxxxxxxxx> wrote:

> Hi All,
> I have an attribute value that I want to convert to a sequence of decimals:
> @colwidth="0.439in 1.845in"
> I am using tokenize to drop the measurement units before I convert each
> member to decimal:
> tokenize($widths,'[^\.\d]')
> This works, except I get a empty string as the last item in the list. I saw
> in Michael's book that I can filter out the empty member with a predicate:
> tokenize($widths,'[^\.\d]')[.]
> I can't quite understand how the predicate [.] works. Is it like saying
> "non-empty strings"? Would it be equivalent to
> [not(.="")]
> Thank you in advance.
> -Rick
> By the way, here is my complete function. Any suggestions for improvements
> are appreciated. I am going from absolute widths:
> 0.439in 1.845in
> to a sequence of percentages:
> 19, 81
>     <!-- Function for converting absolute table column widths to
> proportional (percentage) widths. -->
>     <xsl:function name="rq:getProportionalWidths">
>         <!-- widths parameter is @colwidth in the form of absolute
> dimensions. -->
>         <xsl:param name="widths"/>
>         <!-- Drop the measurement units and convert the strings to
> decimals.
> -->
>         <xsl:variable name="tokens"
> select="tokenize($widths,'[^\.\d]')[.]"/>
>         <xsl:variable name="decimals" select="for $i in $tokens return
> xs:decimal($i)"/>
>         <!-- Divide each number by the total of all numbers and multiply by
> 100. -->
>         <xsl:sequence select="for $i in $decimals return round($i div
> sum($decimals) * 100)"/>
>     </xsl:function>

with best regards,
Mukul gandhi

Current Thread


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.
First Name
Last Name
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.