You haven't said what output you want. The only case that's a little difficult is you need output in the form
<speech>
<character>...</character>
<dialogue>...</dialogue>
</speech>
<speech>
<character>...</character>
<dialogue>...</dialogue>
</speech>
which is probably how the XML should have been designed in the first place (except that your dialogue is really a monologue, right?) The best way of achieving this is probably
<xsl:for-each select="character">
<speech>
<xsl:copy-of select="."/>
<xsl:copy-of select="following-sibling::dialogue[1]"/>
</speech>
</xsl:for-each>
(or the equivalent using apply-templates).
If a character can be followed by several dialogue elements then you have a classic positional grouping problem, best solved using xsl:for-each-group in XSLT 2.0 or by sibling recursion in XSLT 1.0
Michael Kay
http://www.saxonica.com/
Author, XSLT Programmer's Reference and XPath 2.0 Programmer's Reference