Graphics migration 2.6.x to 4.0


  1. ODFXSLTHelper
  2. Useful: display the complete structure of a course in XSL
  3. Services
    1. Training Scheme Department
    2. Training basket" service
    3. Search services
      1. Default view for courses (search_1.2.xsl)
      2. Default view for UEs (search-course_2.3.xsl)
      3. Choice Lists Only" view
      4. Multiple choice criteria" view
      5. Views "classification of results by field" and "classification of results by field then diploma".
  4. The contents
    1. Display of reference tables (domain, mention, Rome code, ...)
  5. Manager(s)
  6. "Sub"-contents people and components in content display ODF 

 

ODFXSLTHelper

In v4.0, courses can be shared and thus linked to several courses. Some of the methods in the XSLT org.ametys.odf.OdfXSLTHelper helper have therefore evolved:

MethodODF 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>        

 

Useful: display the complete structure of a course in 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>        

Services

Training Scheme Department

As a reminder, this service contains an image map whose zones redirect to the search engine with the pre-selection of a diploma type (bachelor's, master's, doctorate, etc.).

Links to the search engine must contain the identifier of the diploma searched for. In 2.6.x, the identifier corresponded to the diploma code ('XA', 'XB', ...). In v4, the identifier is the content identifier Ametys (in the form "content://xxxxx...").
The identifier Ametys must first be retrieved from the diploma code, using the getEntryId method in the 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>        

In 2.6.x, the equivalent was :

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>        

Training basket" service

In your graphic charter, search for all possible calls to cart-helper.i18n.js.
For all occurrences found, replace :

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

by

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

Search services

The XML entry format has evolved for all search engines:

  • Each metadata search criterion is the subject of a form >fields > metadata node.
    If the criterion is an enumerated field (drop-down list), the possible values can be found in form >fields > metadata > enumeration > item.
  • The value sought for a metadata search criterion can be found in a form > values > metadata > metadata node.
  • If facets are enabled, they are listed for each field in form > facets > facet
XML input in 2.6.xXML entry in 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>        

This new entry format is taken into account in all your overloads or own views on search engines ODF.

The following describes the modifications that have been made to XSL for plugin ODF -web.

Default view for courses (search_1.2.xsl)

For the default view, the file XSL search-criteria_1.2.xsl has been modified as follows:

  • Added import of service:web://pages/services/search/search-criteria/search-criteria_3.3.xsl. The rendering of the classic search engine now supports facets (in a drop-down list) and a list of generic metadata search criteria.
  • Removal of "common-service-head-title", "common-service-body-nonempty-content-title", "common-service-body-nonempty-content-content", "common-service-head-js" templates. Indeed, following the previous import, overloading these templates is unnecessary.
  • The facet-lists.js file no longer exists in plugin ODF , but must be imported from plugin web. Thanks to the previous import, this file is imported automatically if facets are enabled. 
  • Template overload "form-search for :
    • add the hidden "catalog" field (required for facet calculation)
    • add the hidden "content-types" field (needed to calculate facets) => template XSL form-search-content-types
    • display the "title" criterion first

If you have overloaded this XSL, check your overload by referring to the https://code file .ametys.org/projects/ODF /repos/odf-web/browse/main/ plugin-odf-web/pages/services/search/search-criteria/search-criteria_1 .2. xsl

In the demo chart, using jqTransform, the following changes have been made to the search-criteria_1.2 file .xsl:

  • the common-service-head-js template has been renamed 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"/>
  • Injection for 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>        
    });        

    has been replaced by :

    $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>        
    });        

Default view for UEs (search-course_2.3.xsl)

This view imports the previous view, and the search-course_2.3.xsl file has changed very little:

  • Add the XSL form-search-content-types template needed to calculate facets:

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

In the demo chart, using jqTransform, as for the previous view, the following modifications have been made to the search-course_2.3 file .xsl:

  • the common-service-head-js template has been renamed 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"/>
  • Injection for 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>        
    });        

    has been replaced by :

    $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>        
    });        

Choice Lists Only" view

For this view, the file XSL search-criteria-links_1.3.xsl has been modified as follows:

  • The "form-search", "form-search-element", "form-search-element-selected-choice", "form-search-element-list-choice" templates have been adapted to the new XML input format:
    • to search the list of facets, instructions of the type /search/form/fields/*[starts-with(name(), 'criterion-enumerated-')] must be replaced by /search/form/facets/facet[item].
    • to search for the value of a selected facet, statements of type /search/form/values/*[name() = $elementName and normalize-space(.) != ''] must be replaced by /search/form/values/*/metadata[@name = $name and normalize-space(.) != ''].

If you have overloaded this XSL and one of the templates listed, adapt your overload by referring to the https://code file .ametys.org/projects/ODF /repos/odf-web/browse/main/ plugin-odf-web/pages/services/search/search-criteria/search-criteria-links_1 .3.xsl

Multiple choice criteria" view

For this view, the file XSL search-criteria-multiple.xsl has been modified as follows:

  • The "common-service-head-js" template has been renamed "js-facets".
  • The "form-search-element-title", "form-search-element-keywords", "form-search-element-allwords" and "form-search-element-exactwording" templates have been removed, as their overloading is unnecessary.
  • The template "form-search-element" has been replaced by the template "form-search-by-metadata-enum".

If you have overloaded this XSL, check your overloading by referring to the https://code file .ametys.org/projects/ODF /repos/odf-web/browse/main/ plugin-odf-web/pages/services/search/search-criteria/search-criteria-multiple. xsl

Views "classification of results by field" and "classification of results by field then diploma".

For these views, it's the input format for the "domain" and "degree" fields for each search result that has evolved:

In 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>        

In 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"/>

If you have overloaded these XSL, check your overloads by referring to the files https://code.ametys.org/projects/ODF /repos/odf-web/browse/main/ plugin-odf-web/pages/services/search/search-bydomain_1 .3.xsl and https://code.ametys.org/projects/ODF /repos/odf-web/browse/main/ plugin-odf-web/pages/services/search/search-bydomaindegree. xsl

The contents

Display of reference tables (domain, mention, Rome code, ...)

The rendering of fields that have become reference tables will change.

You need to add /@title to all these fields. For example :

<!-- 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>        

become ...

<!-- 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>       

At present, the fields to be checked are :

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

In addition, you need to be careful, as we now have a label for each reference table, whereas before we used to construct a name by hand!
For example, for ECTS, we used to store "2" and then add "ECTS credits" to skin.
Now the label can be directly "2 ECTS credits", so you need to remove the extra i18n keys in the skins.

 

Manager(s)

The Responsible(s) attribute (personInCharge) has changed its structure. It's now a repeater ... It must therefore be managed in skin :

We used to have 

<!-- 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>       

replace with ...

<!-- 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>     

 

"Sub"-contents people and components in content display ODF 

Previously, the persons and orgunits content referenced by the content to be displayed were placed after the main content SAX in persons and orgunits tags, which in turn contained tags with the name of the original metadata and then the "sub"-content saxed in turn.

The second level corresponding to the name of the metadata has been removed to avoid redundant content referenced several times in the main content.

For example, to retrieve a manager, the operation used to be as follows:

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

Now that the second level has been removed, the operation is as follows:

persons/content[@id = $personId]/html/body/node()        
Back to top

Update manual