Migration graphique 2.6.x vers 4.0


  1. ODFXSLTHelper
  2. Utile: afficher la structure complète d'une formation en XSL
  3. Les services
    1. Service "Schéma des formation"
    2. Service "Panier des formations"
    3. Services de recherche
      1. Vue par défaut pour les formations (search_1.2.xsl)
      2. Vue par défaut pour les UE (search-course_2.3.xsl)
      3. Vue "Listes à choix uniquement"
      4. Vue "Critères à choix multiple"
      5. Vues "classification des résultats par domaine" et "classification des résultats par domaine puis diplôme"
  4. Les contenus
    1. Affichage des tables de références (domaine, mention, code Rome, ...)
  5. Responsable(s)
  6. "Sous"-contenus personnes et composantes dans l'affichage d'un contenu ODF 

 

ODFXSLTHelper

En v4.0, les parcours peuvent être partagés et donc être rattachés à plusieurs formations. Certains méthodes du helper XSLT org.ametys.odf.OdfXSLTHelper ont donc évoluées :

MéthodeODF 2.6.xODF 4.0
getParentProgramStructure(String subProgramId, int depth)Renvoie un seul nœud <program> contenant la structure de la formation parente

Renvoie autant de noeuds <program> qu'il y a de formation intégrant ce sous-programme.
Si vous connaissez l'identifiant de la formation souhaitée, utilisez plutôt la méthode getProgramStructure.

getParentProgram (String subprogramId)

Renvoie un seul nœud <program> avec les informations de la formation parente

<program code="J2RB10QU" catalog="2013-2017"        
         domain="SHS" degree="XA"             
     id="programContent://6e6d8176-1ed2-4ab8-8f75-1ca2e060b370"        
         title="Licence Histoire et Géographie">        
</program>        

Renvoie autant de noeuds <program> qu'il y a de formation intégrant ce sous-programme.
Si vous connaissez l'identifiant de la formation souhaitée, utilisez plutôt la méthode getProgram.

<program code="J2RB10QU" catalog="2013-2017"        
         domain="content://bd3f1775-0040-47a8-8486-8fe6ed2b05bb"        
         degree="content://f31ef15a-77e4-422a-a8db-a26bfebb34aa"             
         id="programContent://6e6d8176-1ed2-4ab8-8f75-1ca2e060b370"        
         title="Licence Histoire et Géographie">        
</program>        
<program code="E3PD70AZ" catalog="2013-2017"        
         domain="content://bd3f1775-0040-47a8-8486-8fe6ed2b05bb"        
         degree="content://f31ef15a-77e4-422a-a8db-a26bfebb34aa"             
         id="programContent://0d7e516c-6ee5-4cc9-8eb2-ad6bb567fc63"        
         title="Licence Histoire des Art">        
</program>        
getProgramStructure (String programId, int depth)N/ARenvoie un nœud <program> contenant la structure de la formation jusqu'à une profondeur de depth
getProgram(String programId)N/A

Renvoie un nœud <program> contenant les information de la formation

<program code="J2RB10QU" catalog="2013-2017"        
         domain="content://bd3f1775-0040-47a8-8486-8fe6ed2b05bb"        
         degree="content://f31ef15a-77e4-422a-a8db-a26bfebb34aa"             
         id="programContent://6e6d8176-1ed2-4ab8-8f75-1ca2e060b370"        
         title="Licence Histoire et Géographie">        
</program>        

 

Utile: afficher la structure complète d'une formation en XSL

Voici un exemple de code XSL afin d'afficher la structure complète d'une formation (dans des <ul> <li>) sur une même page, avec les liens vers les pages des sous-programmes et UE enfants.

<xsl:template name="structure">        
 <!-- Récupérer la structure complète à l'aide du helper XSLT 'org.ametys.odf.OdfXSLTHelper' -->        
        <xsl:variable name="structure" select="odf:getProgramStructure(/view/content/@id, -1)"/>        
               
        <ul>        
            <xsl:apply-templates select="$structure" mode="structure">        
                <xsl:with-param name="parentId" select="/view/content/@id"/>        
            </xsl:apply-templates>        
        </ul>        
    </xsl:template>        
           
    <xsl:template match="subprogram" mode="structure">        
        <xsl:param name="parentId"/><!-- Id des parents par ordre ascendant, séparés par des ; -->        
      
        <li>        
            <a href="{resolver:resolve('odf', concat(@id, ';', $parentId))}"><xsl:value-of select="@title"/></a>        
            <xsl:if test="subprogram|courseList|container">        
                <ul>        
                    <xsl:apply-templates select="subprogram|container|courseList" mode="structure">        
                        <xsl:with-param name="parentId" select="concat(@id, ';', $parentId)"/>        
                    </xsl:apply-templates>        
                </ul>        
            </xsl:if>        
        </li>        
    </xsl:template>        
           
    <xsl:template match="container" mode="structure">        
        <xsl:param name="parentId"/><!-- Id des parents par ordre ascendant, séparés par des ; -->        
      
        <li>        
            <xsl:value-of select="@title"/>        
            <xsl:if test="subprogram|courseList|container">        
                <ul>        
                    <xsl:apply-templates select="subprogram|courseList|container" mode="structure">        
                        <xsl:with-param name="parentId" select="$parentId"/>        
                    </xsl:apply-templates>        
                </ul>        
            </xsl:if>        
        </li>        
    </xsl:template>        
           
    <xsl:template match="courseList" mode="structure">        
        <xsl:param name="parentId"/><!-- Id des parents par ordre ascendant, séparés par des ; -->        
      
        <li>        
            <xsl:value-of select="@title"/>        
            <xsl:if test="course">        
                <ul>        
                    <xsl:apply-templates select="course" mode="structure">        
                        <xsl:with-param name="parentId" select="$parentId"/>        
                    </xsl:apply-templates>        
                </ul>        
            </xsl:if>        
        </li>        
    </xsl:template>        
           
    <xsl:template match="course" mode="structure">        
        <xsl:param name="parentId"/><!-- Id des parents par ordre ascendant, séparés par des ; -->        
      
        <li>        
            <a href="{resolver:resolve('odf', concat(@id, ';', $parentId))}"><xsl:value-of select="@title"/></a>        
            <xsl:if test="courseList">        
                <ul>        
                    <xsl:apply-templates select="courseList" mode="structure">        
                        <xsl:with-param name="parentId" select="concat(@id, ';', $parentId)"/>        
                    </xsl:apply-templates>        
                </ul>        
            </xsl:if>        
        </li>        
    </xsl:template>        

Les services

Service "Schéma des formation"

Pour rappel, ce service contient une image map dont les zones redirigent vers le moteur de recherche avec la présélection d'un type de diplôme (licence, master, doctorat, ...).

Les liens vers le moteur de recherche doivent contenir l'identifiant du diplôme recherché. En 2.6.x, l'identifiant correspondait au code du diplôme ('XA', 'XB', ...). En v4 l'identifiant est l'identifiant du contenu Ametys (de la forme "content://xxxxx...").
Il faut donc préalablement récupérer l'identifiant Ametys à partir du code du diplôme, en utilisant la méthode getEntryId du helper XSLT org.ametys.odf.OdfXSLTHelper.

v4.0

<!-- Récupérer les identifiants des diplômes à partir de leur code -->        
<xsl:variable name="licence" select="odf:getEntryId('odf-enumeration.Degree', 'XA')"/><!-- Licence -->        
<xsl:variable name="master" select="odf:getEntryId('odf-enumeration.Degree', 'XB')"/><!-- Master -->        
<!-- etc -->        
        
<!-- Utilisation dans l'image map -->        
<xsl:template name="general-studies">        
    <map name="m_etugenerales" id="m_etugenerales">        
         <area shape="poly" coords="202,257,261,257,261,300,299,300,299,382,152,382,152,300,202,300,202,257" title="PLUGINS_ODFWEB_SERVICE_PROGRAMS_SCHEMA_LICENCE" alt="PLUGINS_ODFWEB_SERVICE_PROGRAMS_SCHEMA_LICENCE" i18n:attr="title alt">        
                    <xsl:call-template name="get-href"><xsl:with-param name="qs" select="concat('degree=', $licence)" /></xsl:call-template>        
        </area>        
        <area shape="rect" coords="152,171,261,254" title="PLUGINS_ODFWEB_SERVICE_PROGRAMS_SCHEMA_MASTER" alt="PLUGINS_ODFWEB_SERVICE_PROGRAMS_SCHEMA_MASTER" i18n:attr="title alt">        
                    <xsl:call-template name="get-href"><xsl:with-param name="qs" select="concat('degree=', $master)" /></xsl:call-template>        
        </area>        
 <!-- etc -->        
   </map>        
</xsl:template>        

En 2.6.x, l'équivalent s'écrivait :

v2.6.x

<xsl:template name="general-studies">        
    <map name="m_etugenerales" id="m_etugenerales">        
         <area shape="poly" coords="202,257,261,257,261,300,299,300,299,382,152,382,152,300,202,300,202,257" title="PLUGINS_ODFWEB_SERVICE_PROGRAMS_SCHEMA_LICENCE" alt="PLUGINS_ODFWEB_SERVICE_PROGRAMS_SCHEMA_LICENCE" i18n:attr="title alt">        
                    <xsl:call-template name="get-href"><xsl:with-param name="qs" select="'degree=XA'"/></xsl:call-template>        
        </area>        
        <area shape="rect" coords="152,171,261,254" title="PLUGINS_ODFWEB_SERVICE_PROGRAMS_SCHEMA_MASTER" alt="PLUGINS_ODFWEB_SERVICE_PROGRAMS_SCHEMA_MASTER" i18n:attr="title alt">        
                    <xsl:call-template name="get-href"><xsl:with-param name="qs" select="'degree=XB'"/></xsl:call-template>        
        </area>        
 <!-- etc -->        
   </map>        
</xsl:template>        

Service "Panier des formations"

Dans votre charte graphique, rechercher tous les appels éventuels à cart-helper.i18n.js.
Pour toutes les occurrences trouvées, remplacez :

<script type="text/javascript" src="{ametys:pluginResourceURL('odf-web', 'js/org/helper/cart-helper.i18n.js')}"></script>        

par

<script type="text/javascript" src="{ametys:pluginResourceURL('odf-web', 'js/cart/cart-helper.js')}"></script>        

Services de recherche

Le format du XML d'entrée a évolué pour tous les moteurs de recherche :

  • Chaque critère de recherche portant sur une métadonnée, fait l'objet d'un noeud form >fields > metadata. 
    Si le critère est un champ énuméré (liste déroulante), les valeurs possible se trouvent dans form >fields > metadata > enumeration > item
  • La valeur recherchée pour un critère de recherche portant sur une métadonnée, se trouve dans un noeud form > values > metadata > metadata
  • Si l'utilisation de facettes est activée, elles sont listées pour chaque champ énumérés dans form > facets > facet
XML d'entrée en 2.6.xXML d'entrée en 4.x
<form>        
  <!-- Champs de recherche ODF v2.6.x -->        
  <fields>        
    <textfield/>        
    <title/>        
    <all-words/>        
    <exact-wording/>        
    <no-words/>        
    <!-- Facets -->        
    <criterion-enumerated-degree count="12">        
      <degree value="XA" count="7">Licence</degree>        
      <degree value="XB" count="5">Master</degree>        
      <degree value="YA" count="0">Doctorat d'université</degree>        
    </criterion-enumerated-degree>        
    <criterion-enumerated-domain count="12">        
      <degree value="ALL" count="4">Art, Lettres, Langues</degree>        
      <degree value="DEG" count="2">Droit, Economie, Gestion</degree>        
      <degree value="SHS" count="6">Sciences humaines et sociales</degree>        
    </criterion-enumerated-degree>        
    <!-- Entête des facettes -->        
    <criteria>        
      <criterion name="degree">Diplôme</criterion>        
      <criterion name="domain">Domaine ministériel</criterion>        
    </criteria>        
  </fields>        
         
  <!-- Valeurs des champs de recherche ODF v2.6.x-->        
  <values>        
    <start>0</start>        
    <offset>10</offset>        
    <title>Titre</title>        
    <textfield>Mots clés</textfield>        
    <!-- Recherche avancée -->        
    <all-words>Tous les mots</all-words>        
    <exact-wording>Mot exact</exact-wording>        
    <no-words>Aucun des mots</no-words>        
    <!-- Recherche sur metadonnées -->        
    <metadata1>value1</metadata1>        
    <metadata2>value2</metadata2>        
  </values>        
</form>        
<form>        
  <!-- Champs de recherche ODF v4.x-->        
  <fields>        
    <textfield/>        
    <!-- Recherche avancée -->        
    <all-words/>        
    <exact-wording/>        
    <no-words/>        
    <!-- Recherche par type de contenus -->        
    <content-types-choice>filter</content-types-choice>        
    <content-types>        
      <content-type>Type 1</content-types>        
      <content-type>Type 2</content-types>        
    </content-types>        
    <!-- Recherche sur les métadonnées -->        
    <metadata name="path/to/metadata1">        
      <label>Label 1</label>        
    </metadata>        
    <metadata name="title">        
      <label>Libellé</label>        
    </metadata>        
    <metadata name="degree">        
      <label>Diplôme</label>        
      <enumeration>        
        <item value="XA"><label>Licence</label></item>        
        <item value="XB"><label>Master</label></item>        
        <item value="YA"><label>Doctorat d'université</label></item>        
      </enumeration>        
    </metadata>        
    <metadata name="domain">        
      <label>Diplôme</label>        
      <enumeration>        
        <item value="ALL"><label>Art, Lettres, Langues</label></item>        
        <item value="DEG"><label>Droit, Economie, Gestion</label></item>        
        <item value="SHS"><label>ciences humaines et sociales</label></item>        
      </enumeration>        
    </metadata>        
  </fields>        
         
  <!-- Valeurs des champs de recherche ODF v4.x-->        
  <values>        
    <textfield>Mots clés</textfield>        
    <!-- Recherche avancée -->        
    <all-words>Tous les mots</all-words>        
    <exact-wording>Mot exact</exact-wording>        
    <no-words>Aucun des mots</no-words>        
    <!-- Recherche sur metadonnées -->        
    <metadata>        
      <metadata name="title">titre recherché</metadata>        
      <metadata name="path/to/metadata1">value1</metadata>        
      <metadata name="path/to/metadata2">value2</metadata>        
    </metadata>        
  </values>        
         
  <!-- Facets -->        
  <facets>        
       <facet name="degree" total="12">        
          <item value="XA" count="7">Licence</item>        
          <item value="XB" count="5">Master</item>        
          <item value="YA" count="0">Doctorat d'université</item>        
       </facet>        
       <facet name="domain" total="12">        
          <item value="ALL" count="4">Art, Lettres, Langues</item>        
          <item value="DEG" count="2">Droit, Economie, Gestion</item>        
          <item value="SHS" count="6">Sciences humaines et sociales</item>        
       </facet>        
  </facets>        
</form>        

Ce nouveau format d'entrée est en prendre en compte dans toutes vos surcharges ou propres vues sur les moteurs de recherche ODF.

Ci-après sont décrit les modifications qui ont été nécessaires dans les XSL fournies pour le plugin ODF-web.

Vue par défaut pour les formations (search_1.2.xsl)

Pour la vue par défaut, le fichier XSL search-criteria_1.2.xsl a été modifié comme suit :

  • Ajout de l'import du fichier service:web://pages/services/search/search-criteria/search-criteria_3.3.xsl. En effet, le rendu du moteur de recherche classique supporte maintenant les facettes (dans une liste déroulante) et une liste de critères de recherche portantsur des  métadonnées de manière générique.
  • Suppression des templates "common-service-head-title", "common-service-body-nonempty-content-title", "common-service-body-nonempty-content-content", "common-service-head-js". En effet suite à l'import précédent, la surcharge de ces templates est inutile.
  • Le fichier facet-lists.js n'existe plus dans le plugin ODF, il doit être importé depuis le plugin web. Grace à l'import précédent, ce fichier est importé automatiquement si les facettes sont activée 
  • Surcharge du template "form-search" pour :
    • ajouter le champ caché "catalog" (nécessaire pour le calcul des facettes)
    • ajouter le champ caché "content-types" (nécessaire pour le calcul des facettes) => template XSL form-search-content-types
    • afficher le critère "titre" en premier

Si vous avez surcharger cette XSL, vérifier votre surcharge en vous reportant au fichier https://code.ametys.org/projects/ODF/repos/odf-web/browse/main/plugin-odf-web/pages/services/search/search-criteria/search-criteria_1.2.xsl

Dans la charte de démo, utilisant jqTransform, les modifications suivantes ont été faites pour le fichier search-criteria_1.2.xsl :

  • le template common-service-head-js a été renommé js-facets 
  • l'import du fichier JS
    <script src="{ametys:pluginResourceURL('odf-web', 'js/search/facet-lists.i18n.js')}" type="text/javascript"></script>
    a été remplacé par
    <script src="{$uri-prefix}/plugins/web/resources/js/search/facet-lists.{$lang}.js" type="text/javascript"/>
  • L'injection pour jqTransform :

    $j().ready(function() {        
       <xsl:for-each select="/search/form/fields/criteria/criterion">        
           injectSelectHandler_<xsl:value-of select="$uniqueId"/>('search-<xsl:value-of select="@name"/>-<xsl:value-of select="$uniqueId"/>');        
      </xsl:for-each>        
    });        

    a été remplacée par  :

    $j().ready(function() {        
        <xsl:for-each select="/search/form/facets/facet">        
            injectSelectHandler_<xsl:value-of select="$uniqueId"/>('search-metadata-<xsl:value-of select="@name"/>-<xsl:value-of select="$uniqueId"/>');        
        </xsl:for-each>        
    });        

Vue par défaut pour les UE (search-course_2.3.xsl)

Cette vue important la vue précédent, le fichier search-course_2.3.xsl n'a que très peu été modifié :

  • Ajout du template XSL form-search-content-types nécessaire pour le calcul des facettes :

    <xsl:template name="form-search-content-types">        
       <input type="hidden" name="content-types" value="org.ametys.plugins.odf.Content.course"/>        
    </xsl:template>        

Dans la charte de démo, utilisant jqTransform, comme pour la vue précédente, les modifications suivantes ont été faites pour le fichier search-course_2.3.xsl :

  • le template common-service-head-js a été renommé js-facets 
  • l'import du fichier JS
    <script src="{ametys:pluginResourceURL('odf-web', 'js/search/facet-lists.i18n.js')}" type="text/javascript"></script>
    a été remplacé par
    <script src="{$uri-prefix}/plugins/web/resources/js/search/facet-lists.{$lang}.js" type="text/javascript"/>
  • L'injection pour jqTransform :

    $j().ready(function() {        
       <xsl:for-each select="/search/form/fields/criteria/criterion">        
           injectSelectHandler_<xsl:value-of select="$uniqueId"/>('search-<xsl:value-of select="@name"/>-<xsl:value-of select="$uniqueId"/>');        
      </xsl:for-each>        
    });        

    a été remplacée par  :

    $j().ready(function() {        
        <xsl:for-each select="/search/form/facets/facet">        
            injectSelectHandler_<xsl:value-of select="$uniqueId"/>('search-metadata-<xsl:value-of select="@name"/>-<xsl:value-of select="$uniqueId"/>');        
        </xsl:for-each>        
    });        

Vue "Listes à choix uniquement"

Pour cette vue, le fichier XSL search-criteria-links_1.3.xsl a été modifié comme suit :

  • Les templates "form-search", "form-search-element", "form-search-element-selected-choice", "form-search-element-list-choice" ont été adaptés au nouveau format XML d'entrée :
    • pour rechercher la liste des facettes, les instructions du type /search/form/fields/*[starts-with(name(), 'criterion-enumerated-')] doivent être remplacées par /search/form/facets/facet[item]
    • pour recherche la valeur d'une facette sélectionnée, les instruction du type /search/form/values/*[name() = $elementName and normalize-space(.) != ''] doivent être remplacées par /search/form/values/*/metadata[@name = $name and normalize-space(.) != '']

Si vous avez surcharger cette XSL et l'un des templates cités, adaptez votre surcharge en vous reportant au fichier https://code.ametys.org/projects/ODF/repos/odf-web/browse/main/plugin-odf-web/pages/services/search/search-criteria/search-criteria-links_1.3.xsl

Vue "Critères à choix multiple"

Pour cette vue, le fichier XSL search-criteria-multiple.xsl a été modifié comme suit :

  • Le template "common-service-head-js" a été renommé "js-facets"
  • Les templates "form-search-element-title", "form-search-element-keywords", "form-search-element-allwords" et "form-search-element-exactwording" ont été supprimés car leur surcharge est inutile.
  • Le template "form-search-element" a été remplacé par le template "form-search-by-metadata-enum"

Si vous avez surcharger cette XSL, vérifier votre surcharge en vous reportant au fichier https://code.ametys.org/projects/ODF/repos/odf-web/browse/main/plugin-odf-web/pages/services/search/search-criteria/search-criteria-multiple.xsl

Vues "classification des résultats par domaine" et "classification des résultats par domaine puis diplôme"

Pour ces vues, c'est le format d'entrée pour les champs "domain" et "degree" pour chaque résultat de recherche qui a évolué :

En 2.6.x

<hit>        
 <content id="..." title="Licence LEA Anglais - Allemand">        
 <domain value="ALL">Art, Lettres et Langues</domain>        
 <degree value="XA">Licence</domain>        
 <!-- autres champs du contenus -->        
 </content>        
</hit>        

En 4.x

<hit>        
 <content id="..." title="Licence LEA Anglais - Allemand">        
 <domain id="content://xxxx" title="Art, Lettres et Langues" lang="fr" name="art-lettres-langues"/>        
 <degree id="content://yyyy" title="Licence" lang="fr" name="licence"/>        
 <!-- autres champs du contenus -->        
 </content>        
</hit>        

De fait, il faut remplacer les occurences de content/domain/@value par content/domain/@id et les occurences de <xsl:value-of select="content/domain"/> par <xsl:value-of select="content/domain/@title"/>

Si vous avez surcharger ces XSL, vérifier vos surcharges en vous reportant aux fichiers https://code.ametys.org/projects/ODF/repos/odf-web/browse/main/plugin-odf-web/pages/services/search/search-bydomain_1.3.xsl et https://code.ametys.org/projects/ODF/repos/odf-web/browse/main/plugin-odf-web/pages/services/search/search-bydomaindegree.xsl

Les contenus

Affichage des tables de références (domaine, mention, code Rome, ...)

Le rendu des champs qui sont devenus des tables de références à changer.

Il faut rajouter /@title à tous ces champs. Par exemple :

<!-- Type de diplôme -->       
<xsl:if test="normalize-space(metadata/degree ) != ''">       
<li><strong><i18n:text i18n:key="CONTENT_PROGRAM_DEGREE" i18n:catalogue="plugin.odf"/>: </strong><xsl:value-of select="metadata/degree"/></li>       
</xsl:if>        

deviens ...

<!-- Type de diplôme -->       
 <xsl:if test="normalize-space(metadata/degree/@title ) != ''">       
 <li><strong><i18n:text i18n:key="CONTENT_PROGRAM_DEGREE" i18n:catalogue="plugin.odf"/>: </strong><xsl:value-of select="metadata/degree/@title"/></li>       
 </xsl:if>       

Actuellement, les champs qu'il faut vérifier :

degree, domain, mention, educationKind, educationLevel, formOfTeachingOrg, distanceLearning, internship, ects, educationLanguage, duration, nsfCode, rncpLevel, dgesipCode, siseCode, cite97Code, erasmusCode, romeCode, fapCode, jointOrgUnit, place, internshipAbroad, teachingLocation, teachingTerm, timeSlot, level, formofteachingMethod, formofteachingOrg, teachingActivity

De plus il faut faire attention car maintenant on a un label pour chaque table de référence, alors qu'avant on construisait un nom à la main !
Par exemple pour les ECTS on stockait "2" et on rajoutait "crédits ECTS" dans la skin.
Maintenant le label peut être directement "2 crédits ECTS" donc il faut retirer les clés i18n en trop dans les skins .

 

Responsable(s)

L'attribut Responsable(s) (personInCharge) a changé de structure. C'est maintenant un repeater ... Il faut donc le gérer dans la skin :

Avant on avait 

<!-- Responsable(s) -->     
 <xsl:if test="personInCharge/content/html">     
     <xsl:element name="h{$truelevel + 1}"><i18n:text i18n:catalogue="plugin.odf" i18n:key="CONTENT_PROGRAM_PERSON_IN_CHARGE"/></xsl:element>     
     <xsl:apply-templates select="personInCharge/content/html/body/node()" mode="move-hierarchy">     
         <xsl:with-param name="level" select="$truelevel + 2"/>     
     </xsl:apply-templates>     
 </xsl:if>       

il faut remplacer par ...

<!-- Responsable(s) -->     
 <xsl:if test="metadata/personInCharge/entry/persons">     
     
 <xsl:element name="h{$truelevel + 1}"><i18n:text i18n:catalogue="plugin.odf" i18n:key="CONTENT_PROGRAM_PERSON_IN_CHARGE"/></xsl:element>     
     
     <xsl:for-each select="metadata/personInCharge/entry">     
         <xsl:choose>     
             <xsl:when test="normalize-space(role/@title) != ''">     
                 <xsl:element name="h{$truelevel + 2}"><xsl:value-of select="role/@title"/></xsl:element>     
                 <xsl:for-each select="persons">     
                     <xsl:variable name="personId" select="@id"/>     
                     <xsl:apply-templates select="//content/persons/content[@id = $personId]/html/body/node()" mode="move-hierarchy">     
                         <xsl:with-param name="level" select="$truelevel + 3"/>     
                     </xsl:apply-templates>     
                 </xsl:for-each>     
             </xsl:when>     
         <xsl:otherwise>     
             <xsl:for-each select="persons">     
                 <xsl:variable name="personId" select="@id"/>     
                 <xsl:apply-templates select="//content/persons/content[@id = $personId]/html/body/node()" mode="move-hierarchy">     
                     <xsl:with-param name="level" select="$truelevel + 2"/>     
                 </xsl:apply-templates>     
             </xsl:for-each>     
         </xsl:otherwise>     
     </xsl:choose>     
     </xsl:for-each>     
 </xsl:if>     

 

"Sous"-contenus personnes et composantes dans l'affichage d'un contenu ODF 

Auparavant les contenus personnes et composantes référencés par le contenu à afficher étaient placés après le SAX principal du contenu dans des balises persons et orgunits qui elles-même contenaient des balises du nom de la métadonnée d'origine avec ensuite le "sous"-contenu saxé à son tour.

Le deuxième niveau correspondant au nom de la métadonnée a été supprimé afin d'éviter les redondances de contenus référencés plusieurs fois dans le contenu principal.

Par exemple, pour récupérer un responsable, auparavant, l'opération était la suivante :

persons/personInCharge/content[@id = $personId]/html/body/node()        

Maintenant, le deuxième niveau disparaissant, l'opération est celle-ci :

persons/content[@id = $personId]/html/body/node()        
Retour en haut