Sure thing. Here's a solution. The idea here that the identity transformation runs the show. Once it matches on a "instructions" node, it copies the "instructions" element and then calls the "insertnewline" template.
There are 2 parameters that you feed this template. One is the "textleft" which is the text field you want to seperate out and add newlines too. The "length" is the number of characters that you want to go before you add the newline. In this case, it's the "instructions" node text, and 44.
The call-template itself works recursively. It takes the input string, and checks if it's less than the length specified. If so, then it just spits out the same string. If not, then it divides the string from the first character in the input, down to the nth character, where n is the length you've specified. It then also adds a newline to that string result "
". From there it calls itself again, this time passing itself new parameters, the length stays the same, but the NEW input string is all characters that are AFTER where you divided the first part. this new smaller string starts the recursion over again. This continues until the resulting string is less than the length specified and stops.
I used your input document to produce the following.
XSLT
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml"/>
<xsl:strip-space elements="*"/>
<xsl:template match="@*|node()">
<xsl:copy>
<xsl:apply-templates select="@*"/>
<xsl:apply-templates/>
</xsl:copy>
</xsl:template>
<xsl:template match="instructions">
<xsl:copy>
<xsl:call-template name="insertnewline">
<xsl:with-param name="length" select="44"/>
<xsl:with-param name="textleft" select="." />
</xsl:call-template>
</xsl:copy>
</xsl:template>
<xsl:template name="insertnewline">
<xsl:param name="length" />
<xsl:param name="textleft"/>
<xsl:choose>
<xsl:when test="string-length($textleft) <= $length">
<xsl:value-of select="$textleft" />
</xsl:when>
<xsl:otherwise>
<xsl:value-of select="substring($textleft, 1, $length)" />
<xsl:text>
</xsl:text>
<xsl:call-template name="insertnewline" >
<xsl:with-param name="length" select="$length" />
<xsl:with-param name="textleft" select="substring($textleft, $length, string-length($textleft))" />
</xsl:call-template>
</xsl:otherwise>
</xsl:choose>
</xsl:template>
</xsl:stylesheet>
Output
<recipe>
<recipeList>
<recipeType description="Breakfast">
<recipeInfo>
<name>Omelet</name>
<summary>An English Breakfast</summary>
<ingredients>Eggs,Butter</ingredients>
<instructions>(1) You will need 2 eggs, 1 tbspn butter,...
............................................
............................................
............................................
.........................</instructions>
</recipeInfo>
</recipeType>
</recipeList>
</recipe>
If you examine the text of the instructions node, you'll find it has a newline after every 44 characters and the last line is just was is leftover. This wasn't heavily tested, so there could be some bugs, but it gives you the idea.