142 lines
3.8 KiB
XML
142 lines
3.8 KiB
XML
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
|
|
|
|
<!--
|
|
This stylesheet was taken from the XSLT FAQ http://www.dpawson.co.uk/xsl/
|
|
|
|
Comments and adaption to be used without normalize-space()
|
|
by Nicola Ken Barozzi nicolaken@apache.org
|
|
-->
|
|
|
|
<!--
|
|
Input:
|
|
|
|
<doc>
|
|
|
|
<para>
|
|
123456 2345 343434 545454 43434 343
|
|
12345 343434 545454 43434 343
|
|
32345645 343434 545454 43434 343
|
|
3422222225 343434 545454 43434 343
|
|
llllllllllllllllllllllooooooooooooooonnnnnnnnnnnggggggggg
|
|
345 343434 545454 43434 343
|
|
</para>
|
|
|
|
</doc>
|
|
|
|
Output:
|
|
|
|
<HTML>
|
|
<BODY>
|
|
<PRE>123456 2345 343434 545454
|
|
43434 343 12345 343434 545454
|
|
43434 343 32345645 343434
|
|
545454 43434 343 3422222225
|
|
343434 545454 43434 343
|
|
lllllllllllllllllllllloooooooo
|
|
ooooooonnnnnnnnnnnggggggggg
|
|
345 343434 545454 43434
|
|
343
|
|
</PRE>
|
|
</BODY>
|
|
</HTML>
|
|
|
|
Fragment ised:
|
|
|
|
<xsl:template match="/doc">
|
|
<HTML><BODY><PRE>
|
|
<xsl:call-template name="format">
|
|
<xsl:with-param select="normalize-space(para)" name="txt" />
|
|
<xsl:with-param name="width">30</xsl:with-param>
|
|
</xsl:call-template>
|
|
</PRE></BODY></HTML>
|
|
</xsl:template>
|
|
|
|
|
|
-->
|
|
|
|
<xsl:template match="/body">
|
|
<body>
|
|
<xsl:call-template name="format">
|
|
<xsl:with-param select="source" name="txt" />
|
|
<xsl:with-param name="width">40</xsl:with-param>
|
|
</xsl:call-template>
|
|
</body>
|
|
</xsl:template>
|
|
|
|
<xsl:template name="format">
|
|
<xsl:param name="txt" />
|
|
<xsl:param name="width" />
|
|
|
|
<!-- if there is still text left -->
|
|
<xsl:if test="$txt">
|
|
|
|
<xsl:variable name = "pretxt" select = "substring($txt,0, $width)" />
|
|
|
|
<xsl:choose>
|
|
<xsl:when test="contains($pretxt, '
')">
|
|
<xsl:value-of select="substring-before($pretxt, '
')"/>
|
|
<xsl:text>
</xsl:text>
|
|
<xsl:call-template name="format">
|
|
<xsl:with-param name="txt" select="substring-after($txt,'
')"/>
|
|
<xsl:with-param select="$width" name="width" />
|
|
</xsl:call-template>
|
|
</xsl:when>
|
|
|
|
<xsl:otherwise>
|
|
<!-- get the width at which to break-->
|
|
<xsl:variable name="real-width">
|
|
<xsl:call-template name="tune-width">
|
|
<xsl:with-param select="$txt" name="txt" />
|
|
<xsl:with-param select="$width" name="width" />
|
|
<xsl:with-param select="$width" name="def" />
|
|
</xsl:call-template>
|
|
</xsl:variable>
|
|
|
|
<!-- output the first part of the broken string -->
|
|
<xsl:value-of select="substring($txt, 1, $real-width)" />
|
|
|
|
<!-- output a newline -->
|
|
<xsl:text>
</xsl:text>
|
|
|
|
<!-- call itself with the remaining part of the text -->
|
|
<xsl:call-template name="format">
|
|
<xsl:with-param select="substring($txt,$real-width + 1)" name="txt" />
|
|
<xsl:with-param select="$width" name="width" />
|
|
</xsl:call-template>
|
|
</xsl:otherwise>
|
|
</xsl:choose>
|
|
</xsl:if>
|
|
</xsl:template>
|
|
|
|
|
|
<!-- used by template "format", it calculates the width at the given def
|
|
|
|
It starts at def length and comes back till it finds a space -->
|
|
<xsl:template name="tune-width">
|
|
<xsl:param name="txt" />
|
|
<xsl:param name="width" />
|
|
<xsl:param name="def" />
|
|
|
|
<xsl:choose>
|
|
<xsl:when test="$width = 0">
|
|
<xsl:value-of select="$def" />
|
|
</xsl:when>
|
|
|
|
<xsl:when test="substring($txt, $width, 1 ) = ' '">
|
|
<xsl:value-of select="$width" />
|
|
</xsl:when>
|
|
|
|
<xsl:otherwise>
|
|
<!-- otherwise need to tune again, trying with $width - 1 -->
|
|
<xsl:call-template name="tune-width">
|
|
<xsl:with-param select="$width - 1" name="width" />
|
|
<xsl:with-param select="$txt" name="txt" />
|
|
<xsl:with-param select="$def" name="def" />
|
|
</xsl:call-template>
|
|
</xsl:otherwise>
|
|
</xsl:choose>
|
|
|
|
</xsl:template>
|
|
|
|
</xsl:stylesheet>
|