Во-первых, тот факт, что ваш входной XML имеет "CDATA", в каком-то смысле не имеет значения ... XSLT не может определить, является ли он CDATA или нет. Что важно в вашем входном XML, так это то, что вы избежали разметки <film>...</film>
и хотите превратить ее в настоящий элемент.
Если вы знаете, что у экранированного элемента всегда будет определенное имя («пленка»), и вы знаете, где оно происходит, вы можете удалить его и заменить его:
<xsl:template match="text()[contains(., '<film>')]">
<film>
<xsl:value-of select="substring-before(substring-after(., '<film>'),
'</film>')"/>
</film>
</xsl:template>
Если вы заранее не знаете, где появятся экранированные теги и как называются элементы, вы можете использовать XSLT 2.0 <xsl:analyze-string>
, чтобы найти и заменить их. Но, как отметил Алехандро, общий синтаксический анализ XML с использованием регулярных выражений может быть очень запутанным. Это будет возможно, только если вы знаете, что разметка будет простой.