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(_at_)alliedbiz(_dot_)com>
06/06/2005 01:52 PM
Please respond to
xsl-list(_at_)lists(_dot_)mulberrytech(_dot_)com
To
<xsl-list(_at_)lists(_dot_)mulberrytech(_dot_)com>
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
--~------------------------------------------------------------------
XSL-List info and archive: http://www.mulberrytech.com/xsl/xsl-list
To unsubscribe, go to: http://lists.mulberrytech.com/xsl-list/
or e-mail: <mailto:xsl-list-unsubscribe(_at_)lists(_dot_)mulberrytech(_dot_)com>
--~--
--~------------------------------------------------------------------
XSL-List info and archive: http://www.mulberrytech.com/xsl/xsl-list
To unsubscribe, go to: http://lists.mulberrytech.com/xsl-list/
or e-mail: <mailto:xsl-list-unsubscribe(_at_)lists(_dot_)mulberrytech(_dot_)com>
--~--