I managed to get this FOR XML EXPLICIT code nearly do what I want it to do.
Code:
SELECT	1 as Tag,
	NULL as Parent,
	'http://somewhere.com' as [Trainings!1!xmlns],
	NULL as [Id!3!IdOwner],
	NULL as [Id!3!IdValue!element],
	NULL as [Training!2!Status!element],
	NULL as [Training!2!Organism!element],
	NULL as [Training!2!Label!element],

UNION ALL

SELECT	2 as Tag,
	1 as Parent,
	NULL as [Trainings!1!xmlns],
	NULL as [Id!3!IdOwner],
	NULL as [Id!3!IdValue!element],
	CASE WHEN GetDate() < MyTable.d_first THEN 'Active' ELSE 'Inactive' END as [Training!2!Status!element],
	MyTable.centre as [Training!2!Organism!element],
	MyTable.desciption as [Training!2!Label!element],
FROM	MyTable

UNION ALL

SELECT	3 as Tag,
	2 as Parent,
	NULL as [Trainings!1!xmlns],
	'ourcompany' as [Id!3!IdOwner],
	MyTable.code as [Id!3!IdValue!element],
	NULL as [Training!2!Status!element],
	NULL as [Training!2!Organism!element],
	NULL as [Training!2!Label!element],
FROM	MyTable

ORDER BY [Training!2!IdValue!element], tag
FOR XML EXPLICIT
This is what I get now:
Code:
<Trainings xmlns="http://somewhere.around">
	<Training>
		<Status>Active</Status>
		<Organism>our organisation</Organism>
		<Label>Hygiene procedures</Label>
		<Id IdOwner="ourcompany">
			<IdValue>521</IdValue>
		</Id>
	</Training>
...
</Trainings>
But it should be:
Code:
<Trainings xmlns="http://somewhere.around">
	<Training>
		<Id IdOwner="ourcompany">
			<IdValue>521</IdValue>
		</Id>
		<Status>Active</Status>
		<Organism><![CDATA[our organisation]]></Organism>
		<Label><![CDATA[Hygiene procedures]]></Label>
	</Training>
...
</Trainings>
All text fields should be put between <![CDATA[ ...]]>
and the <Id IdOwner="ourcompany"> element should come as the first element within the <Training> element.

I tried using [Training!2!Organism!cdata] but that doesn't work.