Subject: Re: [xsl] Formatting multi-line address block to skip blank lines in address From: JBryant@xxxxxxxxx Date: Mon, 6 Jun 2005 14:27:55 -0500 |
Hi, Jerry, You can address this problem in at least a couple ways. The string-length function (to see if add2 and add3 have any content) lies at the heart of several possible solutions. (There's probably a way to do it without the string-length function, but I didn't explore that direction.) Let's assume you have an XML source that looks like this: <addressblocks> <addressblock> <name>Sam Spade</name> <add1>1 Casablanca Way</add1> <add2/> <add3/> <Location>Sam's Place</Location> </addressblock> <addressblock> <name>Sherlock Holmes</name> <add1>221 Baker Street</add1> <add2>Flat B</add2> <add3/> <Location>London</Location> </addressblock> </addressblocks> You could write a stylesheet like this one: <?xml version="1.0" encoding="UTF-8"?> <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> <xsl:template match="addressblocks"> <html> <body> <h1 style="text-align: center">Address Information</h1> <xsl:apply-templates/> </body> </html> </xsl:template> <xsl:template match="addressblock"> <hr/> <xsl:apply-templates/> </xsl:template> <xsl:template match="name"> <h3>Name: <xsl:value-of select="."/></h3> </xsl:template> <xsl:template match="add1"> <h3>Address</h3> <p style="text-indent: .25in"><xsl:value-of select="."/></p> </xsl:template> <xsl:template match="add2|add3"> <xsl:if test="string-length(.) > 0"> <p style="text-indent: .25in"><xsl:value-of select="."/></p> </xsl:if> </xsl:template> <xsl:template match="Location"> <h3>Location:<xsl:value-of select="."/></h3> </xsl:template> </xsl:stylesheet> You could also do a "look-ahead" maneuver from the add1 template, which would change the add1 and add2/add3 templates thus: <xsl:template match="add1"> <h3>Address</h3> <p style="text-indent: .25in"><xsl:value-of select="."/></p> <xsl:if test="string-length(../add2) > 0"> <xsl:apply-templates select="../add2"/> </xsl:if> <xsl:if test="string-length(../add3) > 0"> <xsl:apply-templates select="../add3"/> </xsl:if> </xsl:template> <xsl:template match="add2|add3"> <p style="text-indent: .25in"><xsl:value-of select="."/></p> </xsl:template> And you could do this: <xsl:template match="add1"> <h3>Address</h3> <p style="text-indent: .25in"><xsl:value-of select="."/></p> <xsl:if test="string-length(../add2) > 0"> <p style="text-indent: .25in"><xsl:value-of select="../add2"/></p> </xsl:if> <xsl:if test="string-length(../add3) > 0"> <p style="text-indent: .25in"><xsl:value-of select="../add3"/></p> </xsl:if> </xsl:template> <xsl:template match="add2|add3"/> And another way (that doesn't involve tinkering with the add1 template): <xsl:template match="add2[string-length(.) > 0]|add3[string-length(.) > 0]"> <p style="text-indent: .25in"><xsl:value-of select="."/></p> </xsl:template> <xsl:template match="add2[string-length(.) = 0]|add3[string-length(.) = 0]"/> I'm sure yet other ways exist. Since you mention blocks, I suppose you are producing FO output. However, HTML makes shorter examples, so I used HTML as the output. I tested both the full stylesheet and the last variant with Saxon 8.4. I did not test the other possibilities,but they should work, barring typoes on my part. HTH (and let me know, on the list, if not) Jay Bryant Bryant Communication Services (presently consulting at Synergistic Solution Technologies) "Jerry Johns" <JJohns@xxxxxxxxxxxxx> 06/06/2005 01:52 PM Please respond to xsl-list@xxxxxxxxxxxxxxxxxxxxxx To <xsl-list@xxxxxxxxxxxxxxxxxxxxxx> cc Subject Spam:[xsl] Formatting multi-line address block to skip blank lines in address I have a 5 line address on a form. The 5 lines are: Name Add1 Add2 Add3 Location I originally put these fields into separate text blocks; however, many recipients don't have 3 address lines. Most have only 1, but I have to accomodate more, if they are available. Is there a way to combine all of these fields into a single text block so that: a) each field is on a separate line b) if one of the fields is blank, then it is skipped Example: In this example, Add2 and Add3 have no data. The output would look like: Name Add1 Location Thanks!!! Jerry Jerry L. Johns Allied Business Systems, LLC
Current Thread |
---|
|
<- Previous | Index | Next -> |
---|---|---|
[xsl] Formatting multi-line address, Jerry Johns | Thread | [xsl] Works in firefox but not in i, Marzka, Jeremy |
[xsl] Formatting multi-line address, Jerry Johns | Date | RE: [xsl] Source Reducer, Aron Bock |
Month |