XSLT 1.0 or 2.0? As always, it's going to be easier with 2.0, but a 1.0 solution isn't impossible.
Also you haven't said what the output is. Let's suppose you want to output a <br/> at the end of a line (putting a <p>...</p> around each line is probably a little bit harder, though when you've done one you should be able to do the other.
In principle you can do it like this:
* Call normalize-space() on the input so there are no multiple internal spaces.
* define a function or template "wordwrap" that takes three arguments: the text: the desired line-length, and the number of characters output on the current line so far.
* in this function, find the first space in the text (using string-length(substring-before())). If this plus the length-output-so-far exceeds the desired line length, output a <br/>, and call yourself recursively with length-output-so-far reset to zero. But if the first space position is greater than the desired line length and the length-so-far is zero, force a break after the desired-line-length number of characters. In all other cases, output the characters up to the first space and call yourself recursively, with substring($in, first-space-position + 1) as the text to be processed, and $length-so-far + first-space-position + 1 as the length-so-far.
Michael Kay
http://www.saxonica.com/
Author, XSLT 2.0 and XPath 2.0 Programmer's Reference