Re: [xsl] Filtering on a tokenized list

Subject: Re: [xsl] Filtering on a tokenized list
From: "Mukul Gandhi gandhi.mukul@xxxxxxxxx" <xsl-list-service@xxxxxxxxxxxxxxxxxxxxxx>
Date: Fri, 24 Feb 2017 06:24:23 -0000
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";
                        version="2.0">

    <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')"/>
            <xsl:text>&#xa;</xsl:text>
        </xsl:for-each>
    </xsl:template>

</xsl:stylesheet>

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