Subject: [xsl] Re: Parsing a character string From: Joerg Pietschmann <joerg.pietschmann@xxxxxx> Date: Thu, 01 Mar 2001 14:00:40 +0100 |
"Scott Downie" wrote > I'm flailing about in my attempt to parse a simple string, identify its > elements, and map those elements to a set of output strings. The input consists > of seven-character strings that represent the days of the week. One such string > looks like <<YNYNYYN>>. The first character tells me that, "Yes, the system is > to send an alert on Sunday," the second tells me, "No, don't send an alert on > Monday," and so on down through the days of the week. Here is some XML: There are several more or less elegant solutions. No looping is required unless you want to be flexible in case the number of days in a week changes in the near future. You nearly figured out the most obvious solution: ... <xsl:template match="deliverOnDays"> <td> <xsl:choose> <xsl:when test="substring($string,1,1)='Y'"> <xsl:value-of select="'S'" /> </xsl:when> <xsl:otherwise> <xsl:value-of select="'_'" /> </xsl:otherwise> </xsl:choose> <xsl:choose> <xsl:when test="substring($string,2,1)='Y'"> <xsl:value-of select="'S'" /> </xsl:when> <xsl:otherwise> <xsl:value-of select="'_'" /> </xsl:otherwise> </xsl:choose> [ five more similar statements omitted ] </td> </xsl:template> A somewhat more robust code, if necessary, would be ... <xsl:choose> <xsl:when test="substring($string,1,1)='Y'"> <xsl:value-of select="'S'" /> </xsl:when> <xsl:when test="substring($string,1,1)='N'"> <xsl:value-of select="'_'" /> </xsl:when> <xsl:otherwise> <xsl:message> <xsl:text>Unexpected code at pos 1, got: </xsl:text> <xsl:value-of select=substring($string,1,1)"/> </xsl:message> </xsl:otherwise> </xsl:choose> ... [etcetera] You could also work with data set lookup: <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:data="insert-an-url-here"> <xsl:stylesheet> <data:sendflag pos="1" value="Y">S</data:sendflag> <data:sendflag pos="1" value="N">_</data:sendflag> <data:sendflag pos="2" value="Y">M</data:sendflag> <data:sendflag pos="2" value="N">_</data:sendflag> <data:sendflag pos="3" value="Y">T</data:sendflag> <data:sendflag pos="3" value="N">_</data:sendflag> <data:sendflag pos="4" value="Y">W</data:sendflag> <data:sendflag pos="4" value="N">_</data:sendflag> <data:sendflag pos="5" value="Y">Th</data:sendflag> <data:sendflag pos="5" value="N">_</data:sendflag> <data:sendflag pos="6" value="Y">F</data:sendflag> <data:sendflag pos="6" value="N">_</data:sendflag> <data:sendflag pos="7" value="Y">Sa</data:sendflag> <data:sendflag pos="7" value="N">_</data:sendflag> <xsl:template match="deliverOnDays"> <td> <xsl:value-of select="document('')/xsl:stylesheet/data:sendflag [@pos='1' and @value=substring(.,1,1)]"/> <xsl:value-of select="document('')/xsl:stylesheet/data:sendflag [@pos='2' and @value=substring(.,2,1)]"/> <xsl:value-of select="document('')/xsl:stylesheet/data:sendflag [@pos='3' and @value=substring(.,3,1)]"/> <xsl:value-of select="document('')/xsl:stylesheet/data:sendflag [@pos='4' and @value=substring(.,4,1)]"/> <xsl:value-of select="document('')/xsl:stylesheet/data:sendflag [@pos='5' and @value=substring(.,5,1)]"/> <xsl:value-of select="document('')/xsl:stylesheet/data:sendflag [@pos='6' and @value=substring(.,6,1)]"/> <xsl:value-of select="document('')/xsl:stylesheet/data:sendflag [@pos='7' and @value=substring(.,7,1)]"/> </td> </xsl:template> ... (Beware: untested!) There may be a creative way to use a loop here <grin>: <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:data="insert-an-url-here"> <xsl:stylesheet> <data:sendflag pos="1" value="Y">S</data:sendflag> [...more as above...] <data:index>1</data:index> <data:index>2</data:index> <data:index>3</data:index> <data:index>4</data:index> <data:index>5</data:index> <data:index>6</data:index> <data:index>7</data:index> <xsl:template match="deliverOnDays"> <xsl:variable name="string" select="."/> <td> <xsl:for-each select="document('')/xsl:stylesheet/data:index"> <xsl:value-of select="document('')/xsl:stylesheet/data:sendflag [@pos=. and @value=substring($string,.,1)]"/> </xsl:for-each> </td> </xsl:template> ... (Beware: also untested!) Regards J.Pietschmann XSL-List info and archive: http://www.mulberrytech.com/xsl/xsl-list
Current Thread |
---|
|
<- Previous | Index | Next -> |
---|---|---|
[xsl] Re: The top 10 limitations of, Joerg Pietschmann | Thread | RE: [xsl] Parsing a character strin, Don Bruey |
Re: [xsl] conditional include and p, David Carlisle | Date | Re: [xsl] Re: FXPath - A comment on, Jeni Tennison |
Month |