This is the mail archive of the
xsl-list@mulberrytech.com
mailing list .
Re: plain txt output tips
- From: Nathan Shaw <n8_shaw at yahoo dot com>
- To: xsl-list at lists dot mulberrytech dot com
- Date: Tue, 16 Apr 2002 10:17:13 -0700 (PDT)
- Subject: Re: [xsl] plain txt output tips
- Reply-to: xsl-list at lists dot mulberrytech dot com
I am doing all of the parsing using Saxon, so no Java
involved here (although there will be in the future,
so perhaps I will explore this option a bit).
Right now I am trying to use a recursive template that
I swiped from IBM to take care of the line breaks. I
actually have it working somewhat.
<!-- call the line break template -->
<xsl:variable name="output">
<xsl:call-template name="breakText">
<xsl:with-param name="strMsg" select="$content" />
<xsl:with-param name="numChars" select="80" />
</xsl:call-template>
</xsl:variable>
<xsl:value-of select="$output" />
<!-- setLineBreaks.xsl -->
<xsl:stylesheet
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
version="1.0">
<xsl:variable name="EOL" select="'
'"/>
<xsl:variable name="BREAK" select="' '"/>
<!--
Breaks msg into one or more lines.
Lines are broken at the numChars-th character, so
each line will
have no more than (numChars-1) characters each.
-->
<xsl:template name="breakText">
<xsl:param name="strMsg"/>
<xsl:param name="numChars"/>
<xsl:choose>
<xsl:when test="string-length($strMsg) <
$numChars">
<xsl:value-of select="concat($strMsg,'++')"/>
</xsl:when>
<xsl:otherwise>
<xsl:variable name="strFirst">
<xsl:call-template
name="maxSubstringEndingWithBreak">
<xsl:with-param name="strFragment"
select="substring($strMsg,1,$numChars)"/>
</xsl:call-template>
</xsl:variable>
<xsl:variable name="strRest"
select="substring-after($strMsg,$strFirst)"/>
<xsl:value-of select="$strFirst"/>
<xsl:value-of select="$EOL"/>
<xsl:call-template name="breakText">
<xsl:with-param name="strMsg" select="$strRest"/>
<xsl:with-param name="numChars"
select="$numChars"/>
</xsl:call-template>
</xsl:otherwise>
</xsl:choose>
</xsl:template>
<!--
Given parameter s, this function returns the maximal
left
substring of s ending in a break character. If there
is no
break character, then the entire string is returned.
-->
<xsl:template name="maxSubstringEndingWithBreak">
<xsl:param name="strFragment"/>
<xsl:variable name="len"
select="string-length($strFragment)"/>
<xsl:choose>
<xsl:when test="len <= 1 or
substring($strFragment,$len)=$BREAK or
contains($strFragment,$BREAK)=false">
<xsl:value-of select="$strFragment"/>
</xsl:when>
<xsl:otherwise>
<xsl:call-template
name="maxSubstringEndingWithBreak">
<xsl:with-param name="strFragment"
select="substring($strFragment, 1, $len - 1)"/>
</xsl:call-template>
</xsl:otherwise>
</xsl:choose>
</xsl:template>
</xsl:stylesheet>
Thanks for the tip on using templates instead of
value-of. I can see now how that is more efficient.
--Nate
--- mjyoungblut@mmm.com wrote:
>
> Nate,
> Are you using an OutputFormat, by chance?
> That is, in Java, a
> org.apache.xml.serialize.OutputFormat? We were
> using this an noticed that
> we were getting lines wrapped at 72 characters. If
> so, just call the
> following method on the OutputFormat:
> setLineWidth(0); // No wrapping. The
> default should be 0, but
> it appears to default to 72
>
> Another suggestion - instead of traversing the tree
> like you have done
> below
> PressRelease -> MetaData -> InstitutionalPAO
> -> xxx
>
> you may just want to do the following:
> <xsl:apply-templates
> select="PressRelease/MetaData/InstitutionalPAO"/>
>
> <xsl:template match="InstitutionalPAO">
> <xsl:value-of
> select="FName"/><xsl:text>
</xsl:text>
> <xsl:value-of
> select="LName"/><xsl:text>
</xsl:text>
> ...
> </xsl:template>
>
> Matt
>
>
>
>
> <!--contact info -->
> <xsl:value-of
>
select="PressRelease/MetaData/InstitutionalPAO/FName"
> /><xsl:text> </xsl:text><xsl:value-of
>
select="PressRelease/MetaData/InstitutionalPAO/LName"
> />
> <xsl:text>
</xsl:text>
> <xsl:value-of
>
select="PressRelease/MetaData/InstitutionalPAO/JobTitle"
> />
> <xsl:value-of
>
select="PressRelease/MetaData/InstitutionalPAO/OrgName"
> />
> <xsl:value-of
>
select="PressRelease/MetaData/InstitutionalPAO/Address"
> />
> <xsl:value-of
>
select="PressRelease/MetaData/InstitutionalPAO/SubAddress"
> />
>
> But, I am not sure exactly how to send that variable
> into another named recursive template and spit out
> lines no greater than 72 characters long.
>
> Could you perhaps help get me started here? I would
> appreciate it.
>
> --Nate
>
>
>
>
>
> XSL-List info and archive:
> http://www.mulberrytech.com/xsl/xsl-list
>
__________________________________________________
Do You Yahoo!?
Yahoo! Tax Center - online filing with TurboTax
http://taxes.yahoo.com/
XSL-List info and archive: http://www.mulberrytech.com/xsl/xsl-list