[XSL-LIST Mailing List Archive Home] [By Thread] [By Date] [Recent Entries] [Reply To This Message] 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" 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>
</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
|
PURCHASE STYLUS STUDIO ONLINE TODAY!Purchasing Stylus Studio from our online shop is Easy, Secure and Value Priced! Download The World's Best XML IDE!Accelerate XML development with our award-winning XML IDE - Download a free trial today! Subscribe in XML format
|