Index: main/plugin-odf/cms-ribbon-odf.xml
===================================================================
--- main/plugin-odf/cms-ribbon-odf.xml	(revision 33335)
+++ main/plugin-odf/cms-ribbon-odf.xml	(working copy)
@@ -102,6 +102,7 @@
                     <large/>
                     <medium>
                         <control id="org.ametys.odf.PDFExport"/>
+                        <control id="org.ametys.odf.ExportCatalogInDesign"/>
                     </medium>
                     <small/>
                 </group>
Index: main/plugin-odf/i18n/messages_en.xml
===================================================================
--- main/plugin-odf/i18n/messages_en.xml	(revision 33335)
+++ main/plugin-odf/i18n/messages_en.xml	(working copy)
@@ -1288,7 +1288,20 @@
     <message key="PLUGINS_ODF_EXPORT_INDESIGN_EDUCATION_LEVEL">Program level: </message>
     <message key="PLUGINS_ODF_EXPORT_INDESIGN_PERSON_IN_CHARGE">Responsible</message>
     <message key="PLUGINS_ODF_EXPORT_INDESIGN_ROME_CODE">Identifier ROME</message>
-    
+    <message key="PLUGINS_ODF_EXPORT_INDESIGN_DIALOGBOX_HINT">Choose in the list below the XSLT stylesheet to use in the XML export for InDesign.</message>
+    <message key="PLUGINS_ODF_EXPORT_INDESIGN_DIALOGBOX_XSLT">XSLT</message>
+    <message key="PLUGINS_ODF_EXPORT_INDESIGN_DIALOGBOX_TITLE">XML export for InDesign</message>
+    <message key="PLUGINS_ODF_EXPORT_INDESIGN_DIALOGBOX_OK">Ok</message>
+    <message key="PLUGINS_ODF_EXPORT_INDESIGN_DIALOGBOX_CANCEL">Cancel</message>
+        
+    <message key="PLUGINS_ODF_EXPORT_CATALOG_INDESIGN_BUTTON_LABEL">InDesign export of the catalogue</message>
+    <message key="PLUGINS_ODF_EXPORT_CATALOG_INDESIGN_BUTTON_DESCRIPTION">Exports the wanted programs' catalogue to XML format for an Adobe InDesign template.</message>
+    <message key="PLUGINS_ODF_EXPORT_CATALOG_INDESIGN_FOOTER"></message>
+    <message key="PLUGINS_ODF_EXPORT_CATALOG_INDESIGN_DIALOGBOX_HINT">Select the programs' catalogue you wish to export and the XSLT stylesheets to apply on the XML export for InDesign.</message>
+    <message key="PLUGINS_ODF_EXPORT_CATALOG_INDESIGN_DIALOGBOX_CATALOG">Catalog</message>
+    <message key="PLUGINS_ODF_EXPORT_CATALOG_INDESIGN_DIALOGBOX_XSLT_SINGLE">Unit export</message>
+    <message key="PLUGINS_ODF_EXPORT_CATALOG_INDESIGN_DIALOGBOX_XSLT_GLOBAL">Global export</message>
+        
     <!-- +
          | EXPORT RNCP
          + -->
Index: main/plugin-odf/i18n/messages_fr.xml
===================================================================
--- main/plugin-odf/i18n/messages_fr.xml	(revision 33335)
+++ main/plugin-odf/i18n/messages_fr.xml	(working copy)
@@ -1291,6 +1291,19 @@
     <message key="PLUGINS_ODF_EXPORT_INDESIGN_EDUCATION_LEVEL">Niveaux d'études: </message>
     <message key="PLUGINS_ODF_EXPORT_INDESIGN_PERSON_IN_CHARGE">Responsable de la formation</message>
     <message key="PLUGINS_ODF_EXPORT_INDESIGN_ROME_CODE">Fichiers métiers ROME</message>
+    <message key="PLUGINS_ODF_EXPORT_INDESIGN_DIALOGBOX_HINT">Choisissez dans la liste ci-dessous la feuille de style XSLT à appliquer dans l'export XML pour InDesign.</message>
+    <message key="PLUGINS_ODF_EXPORT_INDESIGN_DIALOGBOX_XSLT">XSLT</message>
+    <message key="PLUGINS_ODF_EXPORT_INDESIGN_DIALOGBOX_TITLE">Export XML pour InDesign</message>
+    <message key="PLUGINS_ODF_EXPORT_INDESIGN_DIALOGBOX_OK">Ok</message>
+    <message key="PLUGINS_ODF_EXPORT_INDESIGN_DIALOGBOX_CANCEL">Annuler</message>
+    
+    <message key="PLUGINS_ODF_EXPORT_CATALOG_INDESIGN_BUTTON_LABEL">Export InDesign du catalogue</message>
+    <message key="PLUGINS_ODF_EXPORT_CATALOG_INDESIGN_BUTTON_DESCRIPTION">Exporte le catalogue de formations souhaité au format XML pour une plaquette Adobe InDesign</message>
+    <message key="PLUGINS_ODF_EXPORT_CATALOG_INDESIGN_FOOTER"></message>
+    <message key="PLUGINS_ODF_EXPORT_CATALOG_INDESIGN_DIALOGBOX_HINT">Choississez le catalogue de l'offre de formation que vous souhaitez exporter ainsi que les feuilles de style XSLT à appliquer pour l'export XML pour InDesign.</message>
+    <message key="PLUGINS_ODF_EXPORT_CATALOG_INDESIGN_DIALOGBOX_CATALOG">Catalogue</message>
+    <message key="PLUGINS_ODF_EXPORT_CATALOG_INDESIGN_DIALOGBOX_XSLT_SINGLE">Export unitaire</message>
+    <message key="PLUGINS_ODF_EXPORT_CATALOG_INDESIGN_DIALOGBOX_XSLT_GLOBAL">Export global</message>
     
     <!-- +
          | EXPORT RNCP
Index: main/plugin-odf/plugin.xml
===================================================================
--- main/plugin-odf/plugin.xml	(revision 33335)
+++ main/plugin-odf/plugin.xml	(working copy)
@@ -448,6 +448,13 @@
    		</components>
     </feature>
     
+   <feature name="odf.export.indesign.transformation.helper">
+        <components>
+            <component class="org.ametys.odf.export.indesign.IndesignTransformationHelper" 
+                       role="org.ametys.odf.export.indesign.IndesignTransformationHelper" />
+        </components>
+    </feature>
+    
     <feature name="link-resolver"> 
         <extensions>
             <extension point="org.ametys.cms.transformation.URIResolverExtensionPoint" 
@@ -5075,6 +5082,29 @@
                 </right>
             </extension> 
             
+            <!-- Catalog export -->
+            <extension id="org.ametys.odf.ExportCatalogInDesign"
+                       point="org.ametys.cms.workspace.ribbon.RibbonControlsManager"
+                       class="org.ametys.runtime.ui.impl.StaticContextualClientSideElement">
+                <action class="org.ametys.ribbon.control.button.ActionButton">
+                    <param name="action">org.ametys.odf.indesign.ExportCatalogInDesign</param>
+                    
+                    <param name="label" i18n="true">PLUGINS_ODF_EXPORT_CATALOG_INDESIGN_BUTTON_LABEL</param>
+                    <param name="default-description" i18n="true">PLUGINS_ODF_EXPORT_CATALOG_INDESIGN_BUTTON_DESCRIPTION</param>
+                    <param name="footer" i18n="true">PLUGINS_ODF_EXPORT_CATALOG_INDESIGN_FOOTER</param>
+                    
+                    <param name="icon-small" file="true">img/actions/export_indesign_16.png</param>
+                    <param name="icon-medium" file="true">img/actions/export_indesign_32.png</param>
+                    <param name="icon-large" file="true">img/actions/export_indesign_48.png</param>
+                </action> 
+                <scripts>
+                    <file>js/org/ametys/odf/indesign/ExportCatalogInDesign.i18n.js</file>
+                    <file>js/org/ametys/odf/indesign/ExportInDesign.i18n.js</file>
+                </scripts>
+                <right>ODF_Rights_Export_InDesign</right>
+            </extension>
+            
+            <!-- Program export -->
             <extension id="org.ametys.odf.InDesignExport"
                        point="org.ametys.cms.workspace.ribbon.RibbonControlsManager" 
                        class="org.ametys.runtime.ui.impl.StaticContextualClientSideElement">
@@ -5092,7 +5122,7 @@
                     <param name="icon-large" file="true">img/actions/export_indesign_48.png</param>
                 </action>
                 <scripts>
-                    <file>js/org/ametys/odf/indesign/ExportInDesign.js</file>
+                    <file>js/org/ametys/odf/indesign/ExportInDesign.i18n.js</file>
                     <file>js/org/ametys/odf/program/button/ODFContentActionButton.js</file>
                 </scripts>
                 <right>ODF_Rights_Export_InDesign</right>
Index: main/plugin-odf/resources/js/org/ametys/odf/indesign/ExportCatalogInDesign.i18n.js
===================================================================
--- main/plugin-odf/resources/js/org/ametys/odf/indesign/ExportCatalogInDesign.i18n.js	(revision 0)
+++ main/plugin-odf/resources/js/org/ametys/odf/indesign/ExportCatalogInDesign.i18n.js	(revision 0)
@@ -0,0 +1,198 @@
+/*
+ *  Copyright 2015 Anyware Services
+ *
+ *  Licensed under the Apache License, Version 2.0 (the "License");
+ *  you may not use this file except in compliance with the License.
+ *  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ *  Unless required by applicable law or agreed to in writing, software
+ *  distributed under the License is distributed on an "AS IS" BASIS,
+ *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *  See the License for the specific language governing permissions and
+ *  limitations under the License.
+ */
+
+Ext.namespace('org.ametys.odf.indesign.ExportCatalogInDesign');
+
+org.ametys.odf.indesign.ExportCatalogInDesign = function (id, config, pluginName)
+{
+	org.ametys.odf.indesign.ExportCatalogInDesign.delayedInitialize(org.ametys.odf.indesign.ExportCatalogInDesign._doExport);
+	
+	org.ametys.odf.indesign.ExportCatalogInDesign._box.show();
+	
+	org.ametys.odf.indesign.ExportCatalogInDesign._loadFormValues();
+}
+
+org.ametys.odf.indesign.ExportCatalogInDesign._loadFormValues = function()
+{
+	var form = org.ametys.odf.indesign.ExportCatalogInDesign._form.getForm();
+	
+	var catalogueField = form.findField('catalogue'); 
+	catalogueField.getStore().load();
+	catalogueField.setValue();
+	catalogueField.clearInvalid();
+	
+	var xsltField = form.findField('xslt');
+	xsltField.getStore().load();
+	xsltField.setValue();
+	xsltField.clearInvalid();
+	
+	var globalXsltField = form.findField('globalXslt');
+	globalXsltField.getStore().load();
+	globalXsltField.setValue();
+	globalXsltField.clearInvalid();
+}
+	
+org.ametys.odf.indesign.ExportCatalogInDesign.delayedInitialize = function (callback)
+{
+	if (org.ametys.odf.indesign.ExportCatalogInDesign._initialized)
+	{
+		return true;
+	}
+		
+	org.ametys.odf.indesign.ExportCatalogInDesign._form = new Ext.FormPanel ({
+		border: false,
+		bodyStyle: 'padding:10px',
+		items: [ 
+		        new org.ametys.HtmlContainer ({
+		        	html: "<i18n:text i18n:key='PLUGINS_ODF_EXPORT_CATALOG_INDESIGN_DIALOGBOX_HINT'/>",
+		        	cls: 'dialog-text-hint'
+		        }),
+		        new org.ametys.form.ComboField ({
+		            mode: 'local',
+		            forceSelection : true,
+		   		 	triggerAction: 'all',
+		   		 
+		            fieldLabel : "<i18n:text i18n:key='PLUGINS_ODF_EXPORT_CATALOG_INDESIGN_DIALOGBOX_CATALOG'/>",
+		            valueField : 'value',
+		            displayField : 'displayText',
+		            store: new Ext.data.XmlStore({
+		                url: getPluginDirectUrl('odf') + '/catalogs.xml',
+		                record: 'item',
+		                fields: [
+		                    {name: 'value', mapping: 'code'},
+		                    {name: 'displayText', mapping: 'title'}
+		                ]
+		            }),
+		            name: 'catalogue',
+		            allowBlank: false,
+		            msgTarget: 'side',
+		            width: 240
+		        }),
+		        new org.ametys.form.ComboField ({
+		            mode: 'local',
+		            forceSelection : true,
+		   		 	triggerAction: 'all',
+		   		 
+		            fieldLabel : "<i18n:text i18n:key='PLUGINS_ODF_EXPORT_CATALOG_INDESIGN_DIALOGBOX_XSLT_SINGLE'/>",
+		            valueField : 'name',
+		            displayField : 'label',
+		            store: new Ext.data.XmlStore({
+		                url: getPluginDirectUrl('odf') + '/indesign/get-xslt',
+		                record: 'item',
+		                fields: [
+		                    {name: 'name', mapping: 'name'},
+		                    {name: 'label', mapping: 'label'}
+		                ],
+		                
+		                // Set the mode to 'single'
+						listeners: {
+							'beforeload': org.ametys.odf.indesign.ExportCatalogInDesign._onBeforeLoadSingle 
+						}
+		            }),
+		            name: 'xslt',
+		            allowBlank: false,
+		            msgTarget: 'side',
+		            width: 240
+		        }),
+		        new org.ametys.form.ComboField ({
+		            mode: 'local',
+		            forceSelection : true,
+		   		 	triggerAction: 'all',
+		   		 
+		            fieldLabel : "<i18n:text i18n:key='PLUGINS_ODF_EXPORT_CATALOG_INDESIGN_DIALOGBOX_XSLT_GLOBAL'/>",
+		            valueField : 'name',
+		            displayField : 'label',
+		            store: new Ext.data.XmlStore({
+		                url: getPluginDirectUrl('odf') + '/indesign/get-xslt',
+		                record: 'item',
+		                fields: [
+		                    {name: 'name', mapping: 'name'},
+		                    {name: 'label', mapping: 'label'}
+		                ],
+		                
+		                // Set the mode to 'global' 
+						listeners: {
+							'beforeload': org.ametys.odf.indesign.ExportCatalogInDesign._onBeforeLoadGlobal 
+						}
+		            }),
+		            name: 'globalXslt',
+		            allowBlank: false,
+		            msgTarget: 'side',
+		            width: 240
+		        })
+	    ]
+	});
+	
+	org.ametys.odf.indesign.ExportCatalogInDesign._box = new org.ametys.DialogBox( {
+		title : "<i18n:text i18n:key='PLUGINS_ODF_EXPORT_INDESIGN_DIALOGBOX_TITLE'/>",
+		icon : getPluginResourcesUrl('odf') + "/img/actions/export_indesign_16.png",
+		cls: 'text-dialog',
+		width: 450,
+		height: 220,
+		autoScroll: true,
+		items : [ org.ametys.odf.indesign.ExportCatalogInDesign._form ],
+		closeAction: 'hide',
+		buttons : [{
+			text: "<i18n:text i18n:key='PLUGINS_ODF_EXPORT_INDESIGN_DIALOGBOX_OK'/>",
+			handler: function () { org.ametys.odf.indesign.ExportCatalogInDesign._chooseTransformationCb (callback); }
+		}, {
+			text: "<i18n:text i18n:key='PLUGINS_ODF_EXPORT_INDESIGN_DIALOGBOX_CANCEL'/>",
+			handler : function () { org.ametys.odf.indesign.ExportCatalogInDesign._box.hide(); }
+		} ]
+	});
+	
+	org.ametys.odf.indesign.ExportCatalogInDesign._initialized = true;
+}
+
+org.ametys.odf.indesign.ExportCatalogInDesign._chooseTransformationCb = function(callback)
+{
+	var form = org.ametys.odf.indesign.ExportCatalogInDesign._form.getForm();
+	if (!form.isValid())
+	{
+		return;
+	}
+	
+	if (typeof callback === 'function')
+	{
+		var xslt = form.findField('xslt').getValue();
+		var globalXslt = form.findField('globalXslt').getValue();
+
+		var args = 'xslt=' + xslt + '&amp;globalXslt=' + globalXslt;
+		
+		callback(args);
+	}
+}
+
+org.ametys.odf.indesign.ExportCatalogInDesign._doExport = function (args)
+{
+	var form = org.ametys.odf.indesign.ExportCatalogInDesign._form.getForm();
+	var catalog = form.findField('catalogue').getValue();
+	
+	var url = getPluginDirectUrl('odf') + '/indesign/' + catalog + '/catalogue.xml?' + args;
+	window.open(url);
+	
+	org.ametys.odf.indesign.ExportInDesign._box.hide();
+}
+
+org.ametys.odf.indesign.ExportCatalogInDesign._onBeforeLoadSingle = function (store, options)
+{
+	options.params.mode = 'single';
+}
+
+org.ametys.odf.indesign.ExportCatalogInDesign._onBeforeLoadGlobal = function (store, options)
+{
+	options.params.mode = 'global';
+}
Index: main/plugin-odf/resources/js/org/ametys/odf/indesign/ExportInDesign.i18n.js
===================================================================
--- main/plugin-odf/resources/js/org/ametys/odf/indesign/ExportInDesign.i18n.js	(revision 33335)
+++ main/plugin-odf/resources/js/org/ametys/odf/indesign/ExportInDesign.i18n.js	(working copy)
@@ -22,20 +22,120 @@
 	var target = org.ametys.messagebus.message.MessageTargetHelper.findFirst(targets, org.ametys.odf.indesign.ExportInDesign._testTarget.createDelegate(this));
 	
 	if (target == null)
-		return; 
+	{
+		return;
+	}
 	
 	var args = 'id=' + target.getParameters().id;
 	for (var i in context.parameters)
 	{
 		args += '&amp;' + i + '=' + encodeURIComponent(context.parameters[i]);
 	}
+		
+	org.ametys.odf.indesign.ExportInDesign.delayedInitialize(org.ametys.odf.indesign.ExportInDesign._doExport, args);
+	org.ametys.odf.indesign.ExportInDesign._box.show();
 	
-    var url = getPluginDirectUrl('odf') + '/indesign/program.xml?' + args;
-    window.open(url);
+	var form = org.ametys.odf.indesign.ExportInDesign._form.getForm();
+	form.findField('xslt').getStore().load();
+	form.findField('xslt').setValue();
+	form.findField('xslt').clearInvalid();
 }
 
-org.ametys.odf.indesign.ExportInDesign._testTarget = function (target)
+org.ametys.odf.indesign.ExportInDesign.delayedInitialize = function (callback, args)
 {
-	return target.getType() == "content" && target.getParameters().type == 'org.ametys.plugins.odf.Content.program';
+	if (org.ametys.odf.indesign.ExportInDesign._initialized)
+	{
+		return true;
+	}
+		
+	org.ametys.odf.indesign.ExportInDesign._form = new Ext.FormPanel ({
+		border: false,
+		items: [ 
+		        new org.ametys.HtmlContainer ({
+		        	html: "<i18n:text i18n:key='PLUGINS_ODF_EXPORT_INDESIGN_DIALOGBOX_HINT'/>",
+		        	cls: 'dialog-text-hint'
+		        }),
+		        new org.ametys.form.ComboField ({
+		            mode: 'local',
+		            forceSelection : true,
+		   		 	triggerAction: 'all',
+		   		 
+		            fieldLabel : "<i18n:text i18n:key='PLUGINS_ODF_EXPORT_INDESIGN_DIALOGBOX_XSLT'/>",
+		            valueField : 'name',
+		            displayField : 'label',
+		            store: new Ext.data.XmlStore({
+		                url: getPluginDirectUrl('odf') + '/indesign/get-xslt',
+		                record: 'item',
+		                fields: [
+		                    {name: 'name', mapping: 'name'},
+		                    {name: 'label', mapping: 'label'}
+		                ],
+		                
+						listeners: {
+							'beforeload': org.ametys.odf.indesign.ExportInDesign._onBeforeLoad 
+						}
+		            }),
+		            name: 'xslt',
+		            allowBlank: false,
+		            msgTarget: 'side',
+		            width: 240
+		        })
+	    ]
+	});
+	
+	org.ametys.odf.indesign.ExportInDesign._box = new org.ametys.DialogBox( {
+		title : "<i18n:text i18n:key='PLUGINS_ODF_EXPORT_INDESIGN_DIALOGBOX_TITLE'/>",
+		icon : getPluginResourcesUrl('odf') + "/img/actions/export_indesign_16.png",
+		cls: 'text-dialog',
+		width: 450,
+		height: 150,
+		autoScroll: true,
+		items : [ org.ametys.odf.indesign.ExportInDesign._form ],
+		closeAction: 'hide',
+		buttons : [{
+			text: "<i18n:text i18n:key='PLUGINS_ODF_EXPORT_INDESIGN_DIALOGBOX_OK'/>",
+			handler: function () { org.ametys.odf.indesign.ExportInDesign._chooseTransformationCb (callback, args); }
+		}, {
+			text: "<i18n:text i18n:key='PLUGINS_ODF_EXPORT_INDESIGN_DIALOGBOX_CANCEL'/>",
+			handler : function () { org.ametys.odf.indesign.ExportInDesign._box.hide(); }
+		} ]
+	});
+	
+	org.ametys.odf.indesign.ExportInDesign._initialized = true;
 }
 
+org.ametys.odf.indesign.ExportInDesign._chooseTransformationCb = function(callback, args)
+{
+	var form = org.ametys.odf.indesign.ExportInDesign._form.getForm();
+	if (!form.isValid())
+	{
+		return;
+	}
+	
+	var xslt = form.findField('xslt').getValue();
+	
+	if (typeof callback === 'function')
+	{
+		callback(xslt, args);
+	}
+}
+
+org.ametys.odf.indesign.ExportInDesign._doExport = function (xslt, args)
+{
+	args += '&amp;xslt=' + xslt;
+	
+	var url = getPluginDirectUrl('odf') + '/indesign/program.xml?' + args;
+	window.open(url);
+	
+	org.ametys.odf.indesign.ExportInDesign._box.hide();
+}
+
+org.ametys.odf.indesign.ExportInDesign._onBeforeLoad = function (store, options)
+{
+	options.params.mode = 'single';
+}
+
+org.ametys.odf.indesign.ExportInDesign._testTarget = function (target)
+{
+	return target.getType() == "content" &amp;&amp; target.getParameters().type == 'org.ametys.plugins.odf.Content.program';
+}
Index: main/plugin-odf/resources/js/org/ametys/odf/indesign/ExportInDesign.js
===================================================================
--- main/plugin-odf/resources/js/org/ametys/odf/indesign/ExportInDesign.js	(revision 33335)
+++ main/plugin-odf/resources/js/org/ametys/odf/indesign/ExportInDesign.js	(nonexistent)
@@ -1,41 +0,0 @@
-/*
- *  Copyright 2015 Anyware Services
- *
- *  Licensed under the Apache License, Version 2.0 (the "License");
- *  you may not use this file except in compliance with the License.
- *  You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- *  Unless required by applicable law or agreed to in writing, software
- *  distributed under the License is distributed on an "AS IS" BASIS,
- *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- *  See the License for the specific language governing permissions and
- *  limitations under the License.
- */
-
-Ext.namespace('org.ametys.odf.indesign.ExportInDesign');
-
-org.ametys.odf.indesign.ExportInDesign = function (id, config, pluginName)
-{
-    var targets = org.ametys.ribbon.RibbonManager.getInstance().getCurrentSelectionTargets();
-	var target = org.ametys.messagebus.message.MessageTargetHelper.findFirst(targets, org.ametys.odf.indesign.ExportInDesign._testTarget.createDelegate(this));
-	
-	if (target == null)
-		return; 
-	
-	var args = 'id=' + target.getParameters().id;
-	for (var i in context.parameters)
-	{
-		args += '&amp;' + i + '=' + encodeURIComponent(context.parameters[i]);
-	}
-	
-    var url = getPluginDirectUrl('odf') + '/indesign/program.xml?' + args;
-    window.open(url);
-}
-
-org.ametys.odf.indesign.ExportInDesign._testTarget = function (target)
-{
-	return target.getType() == "content" && target.getParameters().type == 'org.ametys.plugins.odf.Content.program';
-}
-
Index: main/plugin-odf/sitemap.xmap
===================================================================
--- main/plugin-odf/sitemap.xmap	(revision 33335)
+++ main/plugin-odf/sitemap.xmap	(working copy)
@@ -60,6 +60,9 @@
             <map:generator name="fo-programs" src="org.ametys.odf.export.pdf.FOProgramsGenerator" />
             
             <map:generator name="odf-catalogs" src="org.ametys.odf.catalog.generators.CatalogsGenerator" />
+            
+            <map:generator name="get-indesign-xslt" src="org.ametys.odf.export.indesign.GetIndesignFilesGenerator" />
+            <map:generator name="indesign-catalogue" src="org.ametys.odf.export.indesign.IndesignCatalogueGenerator" />
 		</map:generators>
 		
 		<map:actions>
@@ -1030,26 +1033,58 @@
             <!-- +
                  | InDesign export 
                  + -->
+                 
+            <!-- Get the unit/global stylesheets for indesign exports -->
+            <map:match pattern="indesign/get-xslt">
+                <map:generate type="get-indesign-xslt">
+                    <map:parameter name="mode" value="{request-param:mode}" />
+                </map:generate>
+                <map:transform type="i18n">
+                    <map:parameter name="locale" value="{locale:locale}"/>
+                </map:transform>
+                <map:serialize type="xml" />
+            </map:match>     
+                 
+             
+             <!-- Export of a single program -->
             <map:match pattern="indesign/program.xml">
-                <map:act type="set-filename"> 
-                    <map:parameter name="extension" value="xml"/>
-                    <map:act type="get-content">
-                        <map:parameter name="id" value="{request-param:id}"/>
-                        
-                        <map:aggregate element="view" label="xml">
-                            <map:part src="cocoon:/pdf-content-program"/>
-                        </map:aggregate>
-                        <map:transform type="i18n">
-                            <map:parameter name="locale" value="{request-attr:renderingLanguage}"/>
-                            <map:parameter name="plugin" value="{request-attr:pluginName}"/>
-                        </map:transform>
-                        <map:transform type ="xslt" src="odf-view://stylesheets/indesign/program2indesign.xsl" label="xsl"/>
-                        <map:transform type="i18n">
-                            <map:parameter name="locale" value="{request-attr:renderingLanguage}"/>
-                            <map:parameter name="plugin" value="{request-attr:pluginName}"/>
-                        </map:transform>
-                        <map:serialize type="xml"/>
-                    </map:act>
+                <map:act type="set-filename">
+                    <map:redirect-to uri="cocoon:/_indesign/program.xml"/>
+                 </map:act>
+            </map:match>
+             
+            <!-- Export of a given catalogue -->
+            <map:match pattern="indesign/*/catalogue.xml">
+                <map:act type="set-header"> 
+                    <map:parameter name="Content-Disposition" value="attachment"/>
+                    
+	                <map:generate type="indesign-catalogue">
+	                    <map:parameter name="catalogue" value="{../1}" />
+	                    <map:parameter name="xslt" value="{request-param:xslt}" />
+	                </map:generate>
+                    <map:transform type="xslt" src="context://WEB-INF/stylesheets/indesign/catalogue/{request-param:globalXslt}" label="xsl"/> 
+	                <map:serialize type="xml" />
+                </map:act>
+            </map:match>
+            
+            <map:match pattern="_indesign/program.xml">
+                <map:parameter name="extension" value="xml"/>
+                <map:act type="get-content">
+                    <map:parameter name="id" value="{request-param:id}"/>
+                    
+                    <map:aggregate element="view" label="xml">
+                        <map:part src="cocoon:/pdf-content-program"/>
+                    </map:aggregate>
+                    <map:transform type="i18n">
+                        <map:parameter name="locale" value="{request-attr:renderingLanguage}"/>
+                        <map:parameter name="plugin" value="{request-attr:pluginName}"/>
+                    </map:transform>
+                    <map:transform type="xslt" src="context://WEB-INF/stylesheets/indesign/{request-param:xslt}" label="xsl"/> 
+                    <map:transform type="i18n">
+                        <map:parameter name="locale" value="{request-attr:renderingLanguage}"/>
+                        <map:parameter name="plugin" value="{request-attr:pluginName}"/>
+                    </map:transform>
+                    <map:serialize type="xml"/>
                 </map:act>
             </map:match>
             
Index: main/plugin-odf/src/org/ametys/odf/export/indesign/GetIndesignFilesGenerator.java
===================================================================
--- main/plugin-odf/src/org/ametys/odf/export/indesign/GetIndesignFilesGenerator.java	(revision 0)
+++ main/plugin-odf/src/org/ametys/odf/export/indesign/GetIndesignFilesGenerator.java	(revision 0)
@@ -0,0 +1,53 @@
+package org.ametys.odf.export.indesign;
+
+import java.io.IOException;
+import java.util.Map;
+
+import org.apache.avalon.framework.service.ServiceException;
+import org.apache.avalon.framework.service.ServiceManager;
+import org.apache.cocoon.ProcessingException;
+import org.apache.cocoon.environment.ObjectModelHelper;
+import org.apache.cocoon.environment.Request;
+import org.apache.cocoon.generation.ServiceableGenerator;
+import org.apache.cocoon.xml.XMLUtils;
+import org.xml.sax.SAXException;
+
+import org.ametys.runtime.util.I18nizableText;
+
+/**
+ * SAX the indesign stylesheet names and their labels
+ */
+public class GetIndesignFilesGenerator extends ServiceableGenerator
+{
+    /** The helper for indesign transformations */
+    private IndesignTransformationHelper _indesignTransformationHelper;
+    
+    @Override
+    public void service(ServiceManager serviceManager) throws ServiceException
+    {
+        super.service(serviceManager);
+        _indesignTransformationHelper = (IndesignTransformationHelper) serviceManager.lookup(IndesignTransformationHelper.ROLE);
+    }
+    
+    public void generate() throws IOException, SAXException, ProcessingException
+    {
+        Request request = ObjectModelHelper.getRequest(objectModel);
+        Map<String, I18nizableText> xsltFiles = request.getParameter("mode").equals("global") ? _indesignTransformationHelper.getIndesignGlobalXslt() : _indesignTransformationHelper.getIndesignXslt();
+        
+        contentHandler.startDocument();
+        XMLUtils.startElement(contentHandler, "items");
+        
+        for (String fileName : xsltFiles.keySet())
+        {
+            XMLUtils.startElement(contentHandler, "item");
+            XMLUtils.createElement(contentHandler, "name", fileName);
+            
+            I18nizableText label = xsltFiles.get(fileName);
+            label.toSAX(contentHandler, "label");
+            XMLUtils.endElement(contentHandler, "item");
+        }
+        
+        XMLUtils.endElement(contentHandler, "items");
+        contentHandler.endDocument();
+    }
+}
Index: main/plugin-odf/src/org/ametys/odf/export/indesign/IndesignCatalogueGenerator.java
===================================================================
--- main/plugin-odf/src/org/ametys/odf/export/indesign/IndesignCatalogueGenerator.java	(revision 0)
+++ main/plugin-odf/src/org/ametys/odf/export/indesign/IndesignCatalogueGenerator.java	(revision 0)
@@ -0,0 +1,162 @@
+package org.ametys.odf.export.indesign;
+
+import java.io.IOException;
+import java.net.MalformedURLException;
+
+import org.apache.avalon.framework.service.ServiceException;
+import org.apache.avalon.framework.service.ServiceManager;
+import org.apache.cocoon.ProcessingException;
+import org.apache.cocoon.components.source.impl.SitemapSource;
+import org.apache.cocoon.environment.ObjectModelHelper;
+import org.apache.cocoon.environment.Request;
+import org.apache.cocoon.generation.ServiceableGenerator;
+import org.apache.cocoon.xml.AttributesImpl;
+import org.apache.cocoon.xml.XMLUtils;
+import org.apache.commons.lang.StringUtils;
+import org.xml.sax.SAXException;
+
+import org.ametys.cms.repository.ContentTypeExpression;
+import org.ametys.cms.repository.LanguageExpression;
+import org.ametys.odf.catalog.Catalog;
+import org.ametys.odf.catalog.CatalogsManager;
+import org.ametys.odf.program.Program;
+import org.ametys.odf.program.ProgramFactory;
+import org.ametys.plugins.repository.AmetysObjectIterable;
+import org.ametys.plugins.repository.AmetysObjectResolver;
+import org.ametys.plugins.repository.UnknownAmetysObjectException;
+import org.ametys.plugins.repository.query.QueryHelper;
+import org.ametys.plugins.repository.query.SortCriteria;
+import org.ametys.plugins.repository.query.expression.AndExpression;
+import org.ametys.plugins.repository.query.expression.Expression;
+import org.ametys.plugins.repository.query.expression.Expression.Operator;
+import org.ametys.plugins.repository.query.expression.StringExpression;
+import org.ametys.runtime.config.Config;
+import org.ametys.runtime.util.IgnoreRootHandler;
+import org.ametys.runtime.util.URLEncoder;
+
+/**
+ * Generate the SAX events corresponding to the transformation of a catalogue to a XML file for InDesign
+ */
+public class IndesignCatalogueGenerator extends ServiceableGenerator
+{
+    /** The catalogs manager */
+    private CatalogsManager _catalogsManager;
+    
+    /** The Ametys object resolver */
+    private AmetysObjectResolver _ametysObjectResolver;
+    
+    @Override
+    public void service(ServiceManager sManager) throws ServiceException
+    {
+        super.service(sManager);
+        _catalogsManager = (CatalogsManager) sManager.lookup(CatalogsManager.ROLE);
+        _ametysObjectResolver = (AmetysObjectResolver) sManager.lookup(AmetysObjectResolver.ROLE);
+    }
+    
+    public void generate() throws IOException, SAXException, ProcessingException
+    {
+        Request request = ObjectModelHelper.getRequest(objectModel);
+        
+        String catalogName = parameters.getParameter("catalogue", null);
+        String xslt = request.getParameter("xslt");
+        
+        contentHandler.startDocument();
+        XMLUtils.startElement(contentHandler, "programs");
+        
+        Catalog catalog = _catalogsManager.getCatalog(catalogName);
+        if (catalog == null)
+        {
+            throw new IllegalArgumentException ("Failed to generate the XML for InDesign of unknown catalog '" + catalogName + "'");
+        }
+        
+        XMLUtils.createElement(contentHandler, "catalog", catalog.getTitle());
+        
+        // Retrieve language
+        String lang = request.getParameter("lang");
+        if (StringUtils.isEmpty(lang))
+        {
+            lang = Config.getInstance().getValueAsString("odf.programs.lang");
+        }
+            
+        _saxPrograms(catalog.getName(), lang, xslt);
+        
+        XMLUtils.endElement(contentHandler, "programs");
+        contentHandler.endDocument();
+    }
+    
+    /**
+     * SAX the programs for the given catalogue and language
+     * @param catalogName the catalog's name
+     * @param lang the programs' language
+     * @param xslt the xslt used to transform a given program
+     * @throws MalformedURLException if the url is malformed
+     * @throws IOException if an in / out type error occurs
+     * @throws SAXException if an exception occurs while saxing 
+     */
+    private void _saxPrograms(String catalogName, String lang, String xslt) throws MalformedURLException, IOException, SAXException
+    {
+        AmetysObjectIterable<Program> programs = _getPrograms(catalogName, lang);
+        
+        while (programs.hasNext())
+        {
+            Program program = programs.next();
+            String programId = program.getId();
+            
+            AttributesImpl attrs = new AttributesImpl();
+            attrs.addCDATAAttribute("id", program.getId());
+            attrs.addCDATAAttribute("name", program.getName());
+            attrs.addCDATAAttribute("title", program.getTitle());
+            
+            XMLUtils.startElement(contentHandler, "program", attrs);
+            
+            SitemapSource src = null;      
+            try
+            {
+                src = (SitemapSource) resolver.resolveURI(_getUri(programId, xslt));
+                
+                src.toSAX(new IgnoreRootHandler(contentHandler));
+            }
+            catch (UnknownAmetysObjectException e)
+            {
+                // The content may be archived
+            }
+            finally
+            {
+                resolver.release(src);
+            }
+            XMLUtils.endElement(contentHandler, "program");
+        }
+    }
+
+    
+    /**
+     * Get the programs for the given catalog and language
+     * @param catalog the catalogue
+     * @param lang the language 
+     * @return all of the programs having this catalogue and language
+     */
+    private AmetysObjectIterable<Program> _getPrograms(String catalog, String lang)
+    {
+        Expression programExpression = new ContentTypeExpression(Operator.EQ, ProgramFactory.PROGRAM_CONTENT_TYPE);
+        Expression catalogExpr = new StringExpression(Program.CATALOG, Operator.EQ, catalog);
+        Expression langExpr = new LanguageExpression(Operator.EQ, lang);
+        
+        SortCriteria sortCriteria = new SortCriteria();
+        sortCriteria.addCriterion("title", true, true);
+        String programQuery = QueryHelper.getXPathQuery(null, ProgramFactory.PROGRAM_NODETYPE, new AndExpression(programExpression, catalogExpr, langExpr), sortCriteria);
+        AmetysObjectIterable<Program> programs = _ametysObjectResolver.query(programQuery);
+        
+        return programs;
+    }
+    
+    /**
+     * Get the URI corresponding to the pipeline
+     * @param programId the id of the program
+     * @param xslt the name of the xslt
+     * @return the URI 
+     */
+    protected String _getUri(String programId, String xslt)
+    {
+        return "cocoon://_plugins/odf/_indesign/program.xml?id=" + URLEncoder.encode(programId) + "&xslt=" + xslt;
+    }
+}
Index: main/plugin-odf/src/org/ametys/odf/export/indesign/IndesignTransformationHelper.java
===================================================================
--- main/plugin-odf/src/org/ametys/odf/export/indesign/IndesignTransformationHelper.java	(revision 0)
+++ main/plugin-odf/src/org/ametys/odf/export/indesign/IndesignTransformationHelper.java	(revision 0)
@@ -0,0 +1,200 @@
+package org.ametys.odf.export.indesign;
+
+import java.io.File;
+import java.io.FileFilter;
+import java.io.IOException;
+import java.io.InputStream;
+import java.util.HashMap;
+import java.util.Map;
+
+import org.apache.avalon.framework.component.Component;
+import org.apache.avalon.framework.configuration.Configuration;
+import org.apache.avalon.framework.configuration.ConfigurationException;
+import org.apache.avalon.framework.configuration.DefaultConfigurationBuilder;
+import org.apache.avalon.framework.logger.AbstractLogEnabled;
+import org.apache.avalon.framework.service.ServiceException;
+import org.apache.avalon.framework.service.ServiceManager;
+import org.apache.avalon.framework.service.Serviceable;
+import org.apache.commons.collections.MapUtils;
+import org.apache.commons.io.IOUtils;
+import org.apache.excalibur.source.Source;
+import org.apache.excalibur.source.SourceResolver;
+import org.apache.excalibur.source.impl.FileSource;
+
+import org.ametys.runtime.util.I18nizableText;
+
+/**
+ * Helper storing mappings of xsl stylesheets (used in InDesign transformations) names with their labels. 
+ */
+public class IndesignTransformationHelper extends AbstractLogEnabled implements Component, Serviceable
+{
+    /** The Indesign Transformation Helper's role */
+    public static final String ROLE = IndesignTransformationHelper.class.getName();
+    
+    /** The path of the single program transformation stylesheets */
+    private static final String __XSLT_DIRECTORY_URI = "context://WEB-INF/stylesheets/indesign";
+    
+    /** The path of the catalog transformation stylesheets */
+    private static final String __GLOBAL_XSLT_DIRECTORY_URI = "context://WEB-INF/stylesheets/indesign/catalogue";
+
+    /** The xsl used for single program transformations */
+    private Map<String, I18nizableText> _inDesignXSLT;
+    
+    /** The xsl used for catalog transformations */
+    private Map<String, I18nizableText> _catalogInDesignXSLT;
+
+    private SourceResolver _srcResolver;
+    
+    public void service(ServiceManager manager) throws ServiceException
+    {
+        _srcResolver = (SourceResolver) manager.lookup(SourceResolver.ROLE);
+    }
+    
+    /**
+     * Get available XSLT files for single program InDesign export
+     * @return the mapping of xsl names with their labels 
+     */
+    public Map<String, I18nizableText> getIndesignXslt()
+    {
+        if (MapUtils.isNotEmpty(_inDesignXSLT))
+        {
+            return _inDesignXSLT;
+        }
+        
+        try
+        {
+            _inDesignXSLT = _parseXSLTFiles(__XSLT_DIRECTORY_URI);
+        }
+        catch (IOException e)
+        {
+            getLogger().error("Failed to get XSLT for indesign transformation", e);
+        }
+        
+        return _inDesignXSLT;
+    }
+    
+    /**
+     * Get available XSLT files for ODF catalog InDesign export
+     * @return the mapping of xsl names with their labels 
+     */
+    public Map<String, I18nizableText> getIndesignGlobalXslt()
+    {
+        if (MapUtils.isNotEmpty(_catalogInDesignXSLT))
+        {
+            return _catalogInDesignXSLT;
+        }
+        
+        try
+        {
+            _catalogInDesignXSLT = _parseXSLTFiles(__GLOBAL_XSLT_DIRECTORY_URI);
+        }
+        catch (IOException e)
+        {
+            getLogger().error("Failed to get XSLT for indesign transformation", e);
+        }
+        
+        return _catalogInDesignXSLT;
+    }
+
+    /**
+     * Get the xslt data from the given directory
+     * @param indesignDir the directory containing indesign stylesheets
+     * @return the data under the form of a Map
+     * @throws IOException if error occurred while parsing files
+     */
+    private Map<String, I18nizableText> _parseXSLTFiles(String rootURI) throws IOException
+    {
+        Map<String, I18nizableText> xsltFiles = new HashMap<String, I18nizableText> ();
+        
+        FileSource rootSrc = null;
+        try
+        {
+            rootSrc = (FileSource) _srcResolver.resolveURI(rootURI);
+            if (rootSrc.exists())
+            {
+                File rootDir = rootSrc.getFile();
+                File[] xslFiles = rootDir.listFiles(new FileFilter() 
+                {
+                    public boolean accept(File file)
+                    {
+                        String lowerCasedFileName = file.getName().toLowerCase();
+                        return file.isFile() && lowerCasedFileName.endsWith(".xsl");
+                    }
+                });
+                
+                // Generate the map
+                for (File xslFile : xslFiles)
+                {
+                    I18nizableText label = _getLabel(rootURI, xslFile.getName());
+                    xsltFiles.put(xslFile.getName(), label);
+                }
+            }
+        }
+        finally
+        {
+            if (rootSrc != null)
+            {
+                _srcResolver.release(rootSrc);
+            }
+        }
+        
+        return xsltFiles;
+    }
+    
+    private I18nizableText _getLabel(String rootURI, String value)
+    {
+        String valueWithNoExtension = value.substring(0, value.length() - 4);
+        String url = rootURI + "/" + valueWithNoExtension + ".xml";
+        
+        Source source = null;
+        InputStream inputStream = null;
+        try
+        {
+            source = _srcResolver.resolveURI(url);
+            if (source.exists())
+            {
+                inputStream = source.getInputStream();
+                Configuration conf = new DefaultConfigurationBuilder().build(inputStream);
+                
+                Configuration node = conf.getChild("label");
+                I18nizableText text = _parseI18nizableText(node, "application");
+                return text;
+            }
+        }
+        catch (Exception e) 
+        {
+            // Nothing
+        }
+        finally
+        {
+            IOUtils.closeQuietly(inputStream);
+            _srcResolver.release(source);
+        }
+        
+        int i = valueWithNoExtension.lastIndexOf('/');
+        String shortFilename = valueWithNoExtension.substring(i + 1);
+        return new I18nizableText(shortFilename);
+    }
+    
+    private I18nizableText _parseI18nizableText(Configuration textConfig, String defaultCatalogue) throws ConfigurationException
+    {
+        boolean i18nSupported = textConfig.getAttributeAsBoolean("i18n", false);
+        String text = textConfig.getValue();
+        
+        if (i18nSupported)
+        {
+            String catalogue = textConfig.getAttribute("catalogue", null);
+            
+            if (catalogue == null)
+            {
+                catalogue = defaultCatalogue;
+            }
+            
+            return new I18nizableText(catalogue, text);
+        }
+        else
+        {
+            return new I18nizableText(text);
+        }
+    }
+}
Index: main/plugin-odf/stylesheets/indesign/program2indesign.xsl
===================================================================
--- main/plugin-odf/stylesheets/indesign/program2indesign.xsl	(revision 33335)
+++ main/plugin-odf/stylesheets/indesign/program2indesign.xsl	(nonexistent)
@@ -1,391 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--
-   Copyright 2015 Anyware Services
-
-   Licensed under the Apache License, Version 2.0 (the "License");
-   you may not use this file except in compliance with the License.
-   You may obtain a copy of the License at
-
-       http://www.apache.org/licenses/LICENSE-2.0
-
-   Unless required by applicable law or agreed to in writing, software
-   distributed under the License is distributed on an "AS IS" BASIS,
-   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-   See the License for the specific language governing permissions and
-   limitations under the License.
--->
-<xsl:stylesheet version="1.0"
-                xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
-                xmlns:aid="http://ns.adobe.com/AdobeInDesign/4.0/"
-                xmlns:aid5="http://ns.adobe.com/AdobeInDesign/5.0/"
-                xmlns:docbook="http://docbook.org/ns/docbook"
-                xmlns:xalan="http://xml.apache.org/xalan"
-                xmlns:i18n="http://apache.org/cocoon/i18n/2.1"
-                xmlns:cms="http://ametys.org/cms/3.0"
-                xmlns:date="http://exslt.org/dates-and-times"
-                xmlns:decoder="org.ametys.cms.transformation.xslt.URIDecoder" 
-                exclude-result-prefixes="docbook decoder">
-    
-    <xsl:import href="view://stylesheets/utils.xsl"/>
-    <xsl:import href="common.xsl"/>
-                
-    <xsl:template match="/view/content">
-        <Root>
-            <xsl:call-template name="Header"/>
-            <xsl:call-template name="BlocKeywords"/>
-            <xsl:call-template name="BlocInfo"/>
-            <xsl:call-template name="TextContent"/>
-            <xsl:call-template name="BlocTable"/>
-            <xsl:call-template name="BlocContact"/>
-            <xsl:call-template name="BlocStatistics"/>
-        </Root>
-    </xsl:template>
-    
-    <xsl:template name="Header">
-         <xsl:call-template name="BlocTitle"/>
-         <xsl:call-template name="BlocDegreeDomain"/>
-         <xsl:call-template name="BlocMention"/>
-    </xsl:template>
-    
-    <xsl:template name="TextContent">
-        <BlocText>
-            <xsl:call-template name="BlocPresentation"/>
-            <xsl:call-template name="BlocAccessCondition"/>
-            <xsl:call-template name="BlocPrerequisite"/>
-            <xsl:call-template name="BlocTeachingOrganisation"/>
-            <xsl:call-template name="BlocQualification"/>
-            <xsl:call-template name="BlocFurther"/>
-        </BlocText>
-    </xsl:template>
-    
-    <xsl:template name="BlocKeywords">
-        <BlocKeywords>
-            <keywords aid:pstyle="SPKeywords">
-                <xsl:for-each select="metadata/keywords">#<xsl:value-of select="."/><xsl:if test="position() != last()"><xsl:text>, </xsl:text></xsl:if></xsl:for-each>
-            </keywords>
-        </BlocKeywords>
-    </xsl:template>
-    
-    <xsl:template name="BlocInfo">
-        <BlocInfo>
-            <!-- Nombre de crédits ECTS -->
-            <xsl:call-template name="ects"/>
-            <!-- Durée -->
-            <xsl:call-template name="duration"/>
-            <!-- Niveau d'étude -->
-            <xsl:call-template name="educationLevel"/>
-            <!-- Public concerné (formation initiale, continue, ...) -->
-            <xsl:call-template name="formOfTeachingOrg"/>
-            <!-- Langue d'enseignement -->
-            <xsl:call-template name="educationLanguage"/>
-        </BlocInfo>
-    </xsl:template>
-    
-    <xsl:template name="BlocContact">
-        <BlocContact>
-            <xsl:call-template name="BlocOrgUnit"/>
-            
-            <contact aid:pstyle="SPContact">
-                <xsl:if test="contact/content/content">
-                    <gras aid:cstyle="SCGras"><i18n:text i18n:key="PLUGINS_ODF_EXPORT_INDESIGN_CONTACT" i18n:catalogue="plugin.odf"/></gras><xsl:value-of select="$nl"/>
-                    <xsl:apply-templates select="contact/content/content" mode="contact"/>
-                </xsl:if>
-                <xsl:if test="personInCharge/content/content">
-                    <gras aid:cstyle="SCGras"><i18n:text i18n:key="PLUGINS_ODF_EXPORT_INDESIGN_PERSON_IN_CHARGE" i18n:catalogue="plugin.odf"/></gras><xsl:value-of select="$nl"/>
-                    <xsl:apply-templates select="personInCharge/content/content" mode="contact"/>
-                </xsl:if>
-            </contact>
-            
-            <!-- Lieux de la formation -->
-            <xsl:if test="metadata/place">
-                <place aid:pstyle="SPPlace">
-                    <gras aid:cstyle="SCGras"><i18n:text i18n:key="PLUGINS_ODF_EXPORT_INDESIGN_PLACE" i18n:catalogue="plugin.odf"/><xsl:value-of select="$nl"/></gras>
-                    <xsl:for-each select="metadata/place">
-                        <xsl:if test="position() &gt; 1">, </xsl:if><xsl:value-of select="."/>
-                    </xsl:for-each>
-                </place>
-            </xsl:if>
-        </BlocContact>
-    </xsl:template>
-    
-    <xsl:template name="BlocTitle">
-        <BlocTitle aid:pstyle="SPTitle"><xsl:value-of select="metadata/title"/></BlocTitle>
-    </xsl:template>
-    
-    <xsl:template name="BlocDegreeDomain">
-        <BlocDegreeDomain>
-            <degree aid:pstyle="SPDegree">
-                <xsl:value-of select="metadata/degree"/>
-            </degree>
-            <domain aid:pstyle="SPDomain">
-                <xsl:value-of select="metadata/domain"/>
-            </domain>
-        </BlocDegreeDomain>
-    </xsl:template>
-    
-    <xsl:template name="BlocMention">
-        <BlocMention>
-            <mention aid:pstyle="SPMention"><xsl:value-of select="metadata/mention"/></mention>
-        </BlocMention>
-    </xsl:template>  
-    
-    <xsl:template name="BlocSpeciality">
-        <BlocSpeciality>
-            <speciality aid:pstyle="SPSpeciality"><xsl:value-of select="metadata/speciality"/></speciality>
-        </BlocSpeciality>
-    </xsl:template>  
-    
-    <xsl:template name="BlocOrgUnit">
-        <orgUnit aid:pstyle="SPOrgUnit">
-            <orgUnitTitle aid:pstyle="orgUnitTitle"><xsl:value-of select="orgunits/orgunit/content/content/metadata/title"/></orgUnitTitle><xsl:value-of select="$nl"/>
-            <orgUnitAcronym><xsl:value-of select="orgunits/orgunit/content/content/metadata/acronym"/></orgUnitAcronym><xsl:value-of select="$nl"/>
-            <orgUnitAdresse aid:pstyle="orgUnitTitleAdresse">A completer : NOM BATIMENT</orgUnitAdresse><xsl:value-of select="$nl"/>
-            <orgUnitUrl><xsl:value-of select="orgunits/orgunit/content/content/metadata/webLinkUrl"/></orgUnitUrl>
-        </orgUnit><xsl:value-of select="$nl"/>
-    </xsl:template>     
-    
-    <!-- Présentation et objectifs -->
-    <xsl:template name="BlocPresentation">
-        <presentation aid:pstyle="SPPresentation">
-            <presentationTitre aid:pstyle="SPPresentationTitre"><i18n:text i18n:key="PLUGINS_ODF_EXPORT_INDESIGN_PRESENTATION_TITLE" i18n:catalogue="plugin.odf"/><xsl:value-of select="$nl"/></presentationTitre>
-            <presentationTexte aid:pstyle="SPPresentationTexte">
-                <xsl:if test="cms:isNotRichTextEmpty(metadata/presentation)">
-                    <xsl:apply-templates select="metadata/presentation/docbook:article"/>
-                </xsl:if>
-                <xsl:value-of select="$nl"/>
-                <xsl:if test="cms:isNotRichTextEmpty(metadata/objectives)">
-                    <xsl:apply-templates select="metadata/objectives/docbook:article"/>
-                </xsl:if>
-            </presentationTexte>
-        </presentation>
-    </xsl:template> 
-    
-    <!-- Organisation de la formation -->
-    <xsl:template name="BlocTeachingOrganisation">
-        <teachingOrganization aid:pstyle="SPTeachingOrganization">
-            <teachingOrganizationTitre aid:pstyle="SPTeachingOrganizationTitre"><i18n:text i18n:key="PLUGINS_ODF_EXPORT_INDESIGN_TEACHING_ORGANISATION_TITLE" i18n:catalogue="plugin.odf"/><xsl:value-of select="$nl"/></teachingOrganizationTitre>
-            <teachingOrganizationTexte aid:pstyle="SPTeachingOrganizationText">
-                <xsl:if test="cms:isNotRichTextEmpty(metadata/teachingOrganization)">
-                    <xsl:apply-templates select="metadata/teachingOrganization/docbook:article"/>
-                </xsl:if>
-            </teachingOrganizationTexte>
-        </teachingOrganization>
-    </xsl:template> 
-    
-    <!-- Condition d'accès et public cible -->
-    <xsl:template name="BlocAccessCondition">
-        <accessCondition aid:pstyle="SPAccessCondition">
-            <accessConditionTitre aid:pstyle="SPAccessConditionTitre"><i18n:text i18n:key="PLUGINS_ODF_EXPORT_INDESIGN_ACCESS_CONDITION_TITLE" i18n:catalogue="plugin.odf"/><xsl:value-of select="$nl"/></accessConditionTitre>
-            <accessConditionTexte aid:pstyle="SPAccessConditionTexte">
-                <xsl:if test="cms:isNotRichTextEmpty(metadata/accessCondition)">
-                    <xsl:apply-templates select="metadata/accessCondition/docbook:article"/>
-                </xsl:if>
-                <xsl:value-of select="$nl"/>
-                <xsl:if test="cms:isNotRichTextEmpty(metadata/targetGroup)">
-                    <xsl:apply-templates select="metadata/targetGroup/docbook:article"/>
-                </xsl:if>
-            </accessConditionTexte>
-        </accessCondition>
-    </xsl:template>
-    
-    <!-- Débouchés, poursuite d'études -->
-    <xsl:template name="BlocFurther">
-        <further aid:pstyle="SPFurther">
-            <furtherTitre aid:pstyle="SPFurtherTitre"><i18n:text i18n:key="PLUGINS_ODF_EXPORT_INDESIGN_FURTHER_TITLE" i18n:catalogue="plugin.odf"/><xsl:value-of select="$nl"/></furtherTitre>
-            <furtherTexte aid:pstyle="SPFurtherTexte">
-                <xsl:if test="cms:isNotRichTextEmpty(metadata/furtherStudy)">
-                    <xsl:apply-templates select="metadata/furtherStudy/docbook:article"/><xsl:value-of select="$nl"/><xsl:value-of select="$nl"/>
-                </xsl:if>
-                <xsl:if test="cms:isNotRichTextEmpty(metadata/studyAbroad)">
-                    <xsl:apply-templates select="metadata/studyAbroad/docbook:article"/><xsl:value-of select="$nl"/><xsl:value-of select="$nl"/>
-                </xsl:if>
-                <xsl:if test="cms:isNotRichTextEmpty(metadata/jobOpportunities)">
-                    <xsl:apply-templates select="metadata/jobOpportunities/docbook:article"/><xsl:value-of select="$nl"/><xsl:value-of select="$nl"/>
-                </xsl:if>
-                <xsl:if test="cms:isNotRichTextEmpty(metadata/reorientation)">
-                    <xsl:apply-templates select="metadata/reorientation/docbook:article"/><xsl:value-of select="$nl"/><xsl:value-of select="$nl"/>
-                </xsl:if>
-                
-                <!-- Référenciels ROME -->
-                <xsl:if test="metadata/romeCode/@value">
-                    <gras aid:cstyle="SCGras"><i18n:text i18n:key="PLUGINS_ODF_EXPORT_INDESIGN_ROME_CODE" i18n:catalogue="plugin.odf"/></gras><xsl:value-of select="$nl"/>
-                    <puce aid:pstyle="SPPuce">
-                        <xsl:for-each select="metadata/romeCode">
-                            <xsl:value-of select="concat(@value, ': ', text())"/><xsl:value-of select="$nl"/>
-                        </xsl:for-each>
-                    </puce>
-                </xsl:if>    
-            </furtherTexte>
-        </further>
-    </xsl:template>
-    
-    <!-- Pré-requis-->
-    <xsl:template name="BlocPrerequisite">
-        <prerequisite aid:pstyle="SPPrerequisite">
-            <prerequisiteTitre aid:pstyle="SPPrerequisiteTitre"><i18n:text i18n:key="PLUGINS_ODF_EXPORT_INDESIGN_PREREQUISITE_TITLE" i18n:catalogue="plugin.odf"/><xsl:value-of select="$nl"/></prerequisiteTitre>
-            <prerequisiteTexte aid:pstyle="SPPrerequisiteTexte">
-                <xsl:if test="cms:isNotRichTextEmpty(metadata/neededPrerequisite)">
-                    <xsl:apply-templates select="metadata/neededPrerequisite/docbook:article"/><xsl:value-of select="$nl"/><xsl:value-of select="$nl"/>
-                </xsl:if>
-                <xsl:if test="cms:isNotRichTextEmpty(metadata/recommendedPrerequisite)">
-                    <xsl:apply-templates select="metadata/recommendedPrerequisite/docbook:article"/>
-                </xsl:if>
-            </prerequisiteTexte>
-        </prerequisite>
-    </xsl:template>
-    
-    <!-- Savoir-faire et compétence -->
-    <xsl:template name="BlocQualification">
-        <qualification aid:pstyle="SPQualification">
-            <qualificationTitre aid:pstyle="SPQualificationTitre"><i18n:text i18n:key="PLUGINS_ODF_EXPORT_INDESIGN_QUALIFICATION_TITLE" i18n:catalogue="plugin.odf"/><xsl:value-of select="$nl"/></qualificationTitre>
-            <qualificationTexte aid:pstyle="SPQualificationTexte">
-                <xsl:if test="cms:isNotRichTextEmpty(metadata/qualification)">
-                    <xsl:apply-templates select="metadata/qualification/docbook:article"/>
-                </xsl:if>
-            </qualificationTexte>
-        </qualification>
-    </xsl:template>
-    
-    <xsl:template name="BlocStatistics">
-        <BlocStatistics>
-            <xsl:if test="normalize-space(metadata/successRate) != ''">
-                <successRate aid:pstyle="SPSuccessRate"><xsl:value-of select="metadata/successRate"/></successRate>
-            </xsl:if>
-        </BlocStatistics>
-    </xsl:template>
-    
-    <xsl:template name="ects">
-        <xsl:if test="metadata/ects != '' and metadata/ects != '0'"><xsl:value-of select="metadata/ects"/><i18n:text i18n:key="PLUGINS_ODF_EXPORT_INDESIGN_ECTS" i18n:catalogue="plugin.odf"/><xsl:value-of select="$nl"/></xsl:if>
-    </xsl:template>
-    
-    <xsl:template name="duration">
-        <xsl:if test="normalize-space(metadata/duration) != ''">
-            <gras aid:cstyle="SCGras"><xsl:text>Durée :</xsl:text></gras><xsl:text> </xsl:text><xsl:value-of select="metadata/duration"/><xsl:value-of select="$nl"/>
-        </xsl:if>
-    </xsl:template>
-    
-    <xsl:template name="educationLanguage">
-        <xsl:if test="normalize-space(metadata/educationLanguage) != ''">
-            <gras aid:cstyle="SCGras"><i18n:text i18n:key="PLUGINS_ODF_EXPORT_INDESIGN_EDUCATION_LANGUAGE" i18n:catalogue="plugin.odf"/></gras><xsl:text> </xsl:text><xsl:value-of select="metadata/educationLanguage"/><xsl:value-of select="$nl"/>
-        </xsl:if>
-    </xsl:template>
-    
-    <xsl:template name="educationLevel">
-        <xsl:if test="normalize-space(metadata/educationLevel) != ''">
-            <gras aid:cstyle="SCGras"><i18n:text i18n:key="PLUGINS_ODF_EXPORT_INDESIGN_EDUCATION_LEVEL" i18n:catalogue="plugin.odf"/></gras><xsl:text> </xsl:text><xsl:value-of select="metadata/educationLevel"/><xsl:value-of select="$nl"/>
-        </xsl:if>
-    </xsl:template>
-    
-    <xsl:template name="formOfTeachingOrg">
-        <xsl:if test="metadata/formofteachingOrg[@value]">
-            <puce aid:pstyle="SPCase">
-                <xsl:for-each select="metadata/formofteachingOrg[@value]">
-                    <xsl:value-of select="."/><xsl:value-of select="$nl"/>
-                </xsl:for-each>
-            </puce><xsl:value-of select="$nl"/>
-        </xsl:if>
-    </xsl:template>
-    
-    <xsl:template name="BlocTable">
-        <BlocTable>
-            <Program>
-                <xsl:for-each select="subprogram/content/content|container">
-                    <xsl:variable name="position" select="position()"/>
-                    <xsl:choose>
-                        <xsl:when test="courseList">
-                            <!-- Final bloc -->
-                            <xsl:apply-templates select="." mode="table"/>
-                        </xsl:when>
-                        <xsl:otherwise>
-                            <xsl:apply-templates select="." mode="table-header">
-                                <xsl:with-param name="level" select="1"/>
-                                <xsl:with-param name="position" select="$position"/>
-                            </xsl:apply-templates>
-                        </xsl:otherwise>
-                    </xsl:choose>
-                </xsl:for-each>
-            </Program>
-        </BlocTable>
-    </xsl:template>
-    
-    <xsl:template match="content|container" mode="table-header">
-        <xsl:param name="level">1</xsl:param>
-        <xsl:param name="position">1</xsl:param>
-        
-        <xsl:element name="BlocTable{$position}H{$level}">
-            <xsl:attribute name="aid:pstyle">SPTableTitre<xsl:value-of select="$level"/></xsl:attribute>
-            <xsl:value-of select="@title"/>
-        </xsl:element><xsl:value-of select="$nl"/>
-        
-        <xsl:for-each select="subprogram/content/content|container">
-            <xsl:variable name="sposition" select="position()"/>
-            <xsl:choose>
-                <xsl:when test="courseList or $level = 3">
-                    <xsl:apply-templates select="." mode="table"/>
-                </xsl:when>
-                <xsl:otherwise>
-                    <xsl:apply-templates select="." mode="table-header">
-                        <xsl:with-param name="level" select="$level + 1"/>
-                        <xsl:with-param name="position" select="$sposition"/>
-                    </xsl:apply-templates>
-                </xsl:otherwise>
-            </xsl:choose>
-        </xsl:for-each>
-    </xsl:template>
-    
-    <xsl:template match="content|container" mode="table">
-        <xsl:element name="ProgrammeS{count(preceding::courseList[count(ancestor::courseList) = 0]) + 1}">
-            <xsl:attribute name="aid5:tablestyle">STASemestre</xsl:attribute>
-            <xsl:attribute name="aid:table">table</xsl:attribute>
-            <xsl:attribute name="aid:trows"><xsl:value-of select="count(courseList/course) + 2" /></xsl:attribute>
-            <xsl:attribute name="aid:tcols">4</xsl:attribute>
-            
-            <Cellule aid5:cellstyle="SCETitre3" aid:table="cell" aid:crows="1" aid:ccols="4" aid:theader="">
-                <xsl:value-of select="@title"/>
-            </Cellule>
-            
-            <!-- Liste d'UE de 1er niveau uniquement -->
-            <xsl:apply-templates select=".//courseList[count(ancestor::courseList) = 0]"/>
-        </xsl:element>
-        <xsl:value-of select="$nl" />
-        <!-- <xsl:value-of select="$sautdebloc" /> -->
-    </xsl:template>
-    
-    <xsl:template match="courseList">
-        <Cellule aid5:cellstyle="SCETitreCL" aid:table="cell" aid:crows="1" aid:ccols="2">
-            <xsl:value-of select="@title"/>
-        </Cellule>
-        <Cellule aid5:cellstyle="SCETitreHours" aid:table="cell" aid:crows="1" aid:ccols="1">Heures</Cellule> 
-        <Cellule aid5:cellstyle="SCETitreECTS" aid:table="cell" aid:crows="1" aid:ccols="1">ECTS</Cellule> 
-        
-        <xsl:apply-templates select="course"/>      
-    </xsl:template>
-    
-    <xsl:template match="course">
-        <Cellule aid5:cellstyle="SCECelluleEntete0" aid:table="cell" aid:crows="1" aid:ccols="1" aid:ccolwidth="50"><xsl:text>UE</xsl:text><xsl:value-of select="position()"/></Cellule>
-        <Cellule aid5:cellstyle="SCECelluleEntete1" aid:table="cell" aid:crows="1" aid:ccols="1" aid:ccolwidth="350">
-            <gras aid:cstyle="SCGras"><xsl:value-of select="@title"/></gras>
-            <xsl:if test="courseList/course">
-                <xsl:value-of select="$nl"/>
-                <xsl:for-each select="courseList/course">
-                    <xsl:value-of select="@title"/><xsl:value-of select="$nl"/>
-                </xsl:for-each>
-            </xsl:if>
-        </Cellule>
-        <Cellule aid5:cellstyle="SCECelluleEntete2" aid:table="cell" aid:crows="1" aid:ccols="1" aid:ccolwidth="60">
-            <xsl:call-template name="course-hours"/>
-        </Cellule>
-        <Cellule aid5:cellstyle="SCECelluleEntete3" aid:table="cell" aid:crows="1" aid:ccols="1" aid:ccolwidth="60">
-            <xsl:call-template name="course-ects"/>
-        </Cellule>
-    </xsl:template>
-    
-    <xsl:template name="course-hours">
-        <xsl:if test="normalize-space(metadata/nbHours) != ''"><xsl:value-of select="metadata/nbHours"/></xsl:if>
-    </xsl:template>
-    
-    <xsl:template name="course-ects">
-        <xsl:if test="normalize-space(metadata/ects) != ''"><xsl:value-of select="metadata/ects"/></xsl:if>
-    </xsl:template>
-    
-</xsl:stylesheet>
\ No newline at end of file
