Given your input, you are probably out of luck unless the data is exactly as posed and you try some recursion to separate the data at a blank line. If your data was this (which surprising matches your XSL but you have no "p" element):
<description>
<p>row2 paragraph1 line1
row2 paragraph1 line2
row2 paragraph1 line3
row2 paragraph1 line4
row2 paragraph1 line5</p>
<p>row2 paragraph2 line1
row2 paragraph2 line2
row2 paragraph2 line3
row2 paragraph2 line4
row2 paragraph2 line5
row2 paragraph2 line6
row2 paragraph2 line7</p>
</description>
Then you could apply keeps at the "p" level to keep the content together. Because your input does not have that, you need to write a template that creates separate blocks and applies keeps on those blocks for the one text() node that is the child of the description element.
It would also need to preserve line breaks if that is also your intention.
OK, now if your data is truly as written (with line breaks and individual lines that you will live with in final output), then put each line into a table-row and use position to determine the few you wish to keep together.