This is a design that's used quite often, though in my view it's a really bad one. XML is designed to be nested hierarchically. The purpose of a CDATA section is to say "the thing in here might look like markup, but I want it treated as ordinary text - don't treat angle brackets differently from any other character". So that's what XSLT does, of course, it treats it as text. You might have something that says <XmlInnerElement> but it's not an element at all: the very purpose of the CDATA section is to tell the recipient not to treat it as an element.
If you can't change the design, then there are two possible ways forward. If you only want to copy the text to the output, but treating it as markup this time, then disable-output-escaping might rescue you - but it's an optional feature that doesn't work in all circumstances, because it requires a special interface between the XSLT processor and the serializer. The other option is to extract the text of the CDATA section and pass it to an XML parser. You can do this in Saxon with the saxon:parse extension function, in another processor you might be able to do it by calling Javascript extensions.
Michael Kay
http://www.saxonica.com/
Author, XSLT Programmer's Reference and XPath 2.0 Programmer's Reference