This chapter covers graphics migration (content rendering, services) specific toODF . Depending on the version of CMS you're migrating, you'll first need to follow the general instructions at CMS on the following pages: - Graphics migration 3.2.x to 3.3. x - Graphics migration 3.3.x to 3.4.x - Graphics migration 3.4.x to 3.5.x
Data format XML Inputs for content Displaying a single field Display a rich field Modifying the data model New fields Deleted fields universalAdjustment" metadata Multiple attachments Training location(s) Links to objects ODF Link to a training course (e.g. "List of training courses" service) Link to a route Links to a ELP
Data format XML Inputs for content In 1.1.x, 1.2.x, 1.3.x a synchronizable field was saxed as a triplet: the non-synchronized value (metadataName ), the synchronized value (metadataName_remote ) and the value indicating whether the field is synchronized or not, i.e. which value to display (metadataName_sync ) :
XML input in 1.1.x, 1.2.x and 1.3.x
Oops! Copy to clipboard failed. Open the code and copy it manually.<metadata>
<title>Licence de mathématiques</title>
<title_remote>LICENCE MATHS</title>
<title_sync>false</title_sync>
<duration_remote>3 ans</duration>
<duration_sync>true</duration_sync>
</metadata>
<metadata>
<title>Licence de mathématiques</title>
<title_remote>LICENCE MATHS</title>
<title_sync>false</title_sync>
<duration_remote>3 ans</duration>
<duration_sync>true</duration_sync>
</metadata>
<metadata>
<title>Licence de mathématiques</title>
<title_remote>LICENCE MATHS</title>
<title_sync>false</title_sync>
<duration_remote>3 ans</duration>
<duration_sync>true</duration_sync>
</metadata>
In 2.0.x, only the value to be displayed (depending on whether the field is synchronized or not) is available as input, which will simplify XSL rendering.
XML entry in 2.0.x
Oops! Copy to clipboard failed. Open the code and copy it manually.<metadata>
<title>Licence de mathématiques</title>
<duration>3 ans</duration>
</metadata>
<metadata>
<title>Licence de mathématiques</title>
<duration>3 ans</duration>
</metadata>
<metadata>
<title>Licence de mathématiques</title>
<duration>3 ans</duration>
</metadata>
Displaying a single field The template get-metadata-value is no longer necessary and has been removed. Now use directly <xsl:value-of select="metadata/metadataName"> .
For example:
Simple field display in 1.1.x, 1.2.x and 1.3.x
Oops! Copy to clipboard failed. Open the code and copy it manually.<xsl:if test="metadata/duration or metadata/duration_remote">
<p class="duration">
<span class="element-name">
<i18n:text i18n:catalogue="plugin.odf" i18n:key="CONTENT_PROGRAM_DURATION"/>
</span>
<xsl:text> </xsl:text>
<span class="element-value">
<xsl:call-template name="get-metadata-value">
<xsl:with-param name="metadataName" select="'duration'"/>
</xsl:call-template>
</span>
</p>
</xsl:if>
<xsl:if test="metadata/duration or metadata/duration_remote">
<p class="duration">
<span class="element-name">
<i18n:text i18n:catalogue="plugin.odf" i18n:key="CONTENT_PROGRAM_DURATION"/>
</span>
<xsl:text> </xsl:text>
<span class="element-value">
<xsl:call-template name="get-metadata-value">
<xsl:with-param name="metadataName" select="'duration'"/>
</xsl:call-template>
</span>
</p>
</xsl:if>
Voir le code
<xsl:if test="metadata/duration or metadata/duration_remote">
<p class="duration">
<span class="element-name">
<i18n:text i18n:catalogue="plugin.odf" i18n:key="CONTENT_PROGRAM_DURATION"/>
</span>
<xsl:text> </xsl:text>
<span class="element-value">
<xsl:call-template name="get-metadata-value">
<xsl:with-param name="metadataName" select="'duration'"/>
</xsl:call-template>
</span>
</p>
</xsl:if>
becomes
Displaying a single field in 2.0.x
Oops! Copy to clipboard failed. Open the code and copy it manually.<xsl:if test="normalize-space(metadata/duration) != ''">
<p class="duration">
<span class="element-name">
<i18n:text i18n:catalogue="plugin.odf" i18n:key="CONTENT_PROGRAM_DURATION"/>
</span>
<xsl:text> </xsl:text>
<span class="element-value"><xsl:value-of select="metadata/duration"/></span>
</p>
</xsl:if>
<xsl:if test="normalize-space(metadata/duration) != ''">
<p class="duration">
<span class="element-name">
<i18n:text i18n:catalogue="plugin.odf" i18n:key="CONTENT_PROGRAM_DURATION"/>
</span>
<xsl:text> </xsl:text>
<span class="element-value"><xsl:value-of select="metadata/duration"/></span>
</p>
</xsl:if>
<xsl:if test="normalize-space(metadata/duration) != ''">
<p class="duration">
<span class="element-name">
<i18n:text i18n:catalogue="plugin.odf" i18n:key="CONTENT_PROGRAM_DURATION"/>
</span>
<xsl:text> </xsl:text>
<span class="element-value"><xsl:value-of select="metadata/duration"/></span>
</p>
</xsl:if>
Astuce Si vous devez remplacer un certain nombre de fois le template get-metadata-value , il est possible d'utiliser la fonctionnalité Trouver/Remplacer tout de votre IDE pour peu que celui-ci autorise les regexp. Voici comment faire sous Eclipse : - Champ trouver mettre <xsl:call-template name="get-metadata-value">\s*<xsl:with-param[^/]*select="'([^"]*)'"[^/]*/>\s*</xsl:call-template> - Champ remplacer mettre <xsl:value-of select="metadata/$1" /> - N'oubliez pas de cocher la case Expressions regulières dans le bloc Options L'utilisation de la fonctionnalité Remplacer tout avec cette configuration modifiera tous les appels de la forme : En leur équivalent version 2.0.x :
Display a rich field The template get-richText-value has been replaced by the template common-content-richtext-field
For example
Displaying a rich field 1.1.x, 1.2.x and 1.3.x
Oops! Copy to clipboard failed. Open the code and copy it manually.<xsl:if test="cms:isNotRichTextEmpty(metadata/presentation) or metadata/presentation_remote">
<xsl:call-template name="get-richText-value">
<xsl:with-param name="metadataName" select="'presentation'"/>
<xsl:with-param name="level" select="$truelevel + 1"/>
<xsl:with-param name="title" select="'plugin.odf:CONTENT_PROGRAM_PRESENTATION'"/>
</xsl:call-template>
</xsl:if>
<xsl:if test="cms:isNotRichTextEmpty(metadata/presentation) or metadata/presentation_remote">
<xsl:call-template name="get-richText-value">
<xsl:with-param name="metadataName" select="'presentation'"/>
<xsl:with-param name="level" select="$truelevel + 1"/>
<xsl:with-param name="title" select="'plugin.odf:CONTENT_PROGRAM_PRESENTATION'"/>
</xsl:call-template>
</xsl:if>
<xsl:if test="cms:isNotRichTextEmpty(metadata/presentation) or metadata/presentation_remote">
<xsl:call-template name="get-richText-value">
<xsl:with-param name="metadataName" select="'presentation'"/>
<xsl:with-param name="level" select="$truelevel + 1"/>
<xsl:with-param name="title" select="'plugin.odf:CONTENT_PROGRAM_PRESENTATION'"/>
</xsl:call-template>
</xsl:if>
becomes
Displaying a rich field 2.0.x
Oops! Copy to clipboard failed. Open the code and copy it manually.<xsl:call-template name="common-content-richtext-field">
<xsl:with-param name="value" select="metadata/presentation"/>
<xsl:with-param name="level" select="$truelevel + 1"/>
<xsl:with-param name="title" select="'plugin.odf:CONTENT_PROGRAM_PRESENTATION'"/>
</xsl:call-template>
<xsl:call-template name="common-content-richtext-field">
<xsl:with-param name="value" select="metadata/presentation"/>
<xsl:with-param name="level" select="$truelevel + 1"/>
<xsl:with-param name="title" select="'plugin.odf:CONTENT_PROGRAM_PRESENTATION'"/>
</xsl:call-template>
<xsl:call-template name="common-content-richtext-field">
<xsl:with-param name="value" select="metadata/presentation"/>
<xsl:with-param name="level" select="$truelevel + 1"/>
<xsl:with-param name="title" select="'plugin.odf:CONTENT_PROGRAM_PRESENTATION'"/>
</xsl:call-template>
Modifying the data model The data model has been slightly modified. A technical migration at data level is also necessary. See Technical migration manual for versions 1.1.x, 1.2.x and 1.3.x to 2.x , paragraph
New fields New fields have been added and can be displayed in XSL :
Disciplinary sector DGESIP (multiple): metadata/dgesipCode FAP code (multiple): metadata/fapCode Deleted fields The following fields have been deleted and should be removed from XSL (unless you wish to keep them):
Sectors of activity : metadata/sector_activity Field / Discipline : metadata/domain_discipline Department : metadata/ministryDomain universalAdjustment" metadata The "universalAdjustement" metadata corresponding to the "Aménagements particuliers" field has been renamed "universalAdjustment".
In your XSL renderings, replace the reference to metadata/universalAdjustement by metadata/universalAdjustment
Multiple attachments As of version 2.0.x, the "File to download" field for a course is a multiple field.
Link to an attachment in 1.1.x, 1.2.x and 1.3.x
Oops! Copy to clipboard failed. Open the code and copy it manually.<xsl:template name="download">
<xsl:param name="truelevel"/>
<xsl:if test="metadata/attachment">
<div class="bloc download">
<xsl:element name="h{$truelevel}"><i18n:text i18n:catalogue="plugin.odf" i18n:key="CONTENT_PROGRAM_ATTACHMENT"/></xsl:element>
<p><a href="{resolver:resolve(metadata/attachment/@type, metadata/attachment/@path, 'true')}"><xsl:value-of select="metadata/attachment/@filename"/></a></p>
</div>
</xsl:if>
</xsl:template>
<xsl:template name="download">
<xsl:param name="truelevel"/>
<xsl:if test="metadata/attachment">
<div class="bloc download">
<xsl:element name="h{$truelevel}"><i18n:text i18n:catalogue="plugin.odf" i18n:key="CONTENT_PROGRAM_ATTACHMENT"/></xsl:element>
<p><a href="{resolver:resolve(metadata/attachment/@type, metadata/attachment/@path, 'true')}"><xsl:value-of select="metadata/attachment/@filename"/></a></p>
</div>
</xsl:if>
</xsl:template>
Voir le code
<xsl:template name="download">
<xsl:param name="truelevel"/>
<xsl:if test="metadata/attachment">
<div class="bloc download">
<xsl:element name="h{$truelevel}"><i18n:text i18n:catalogue="plugin.odf" i18n:key="CONTENT_PROGRAM_ATTACHMENT"/></xsl:element>
<p><a href="{resolver:resolve(metadata/attachment/@type, metadata/attachment/@path, 'true')}"><xsl:value-of select="metadata/attachment/@filename"/></a></p>
</div>
</xsl:if>
</xsl:template>
becomes
Links to attachments in 2.0.x
Oops! Copy to clipboard failed. Open the code and copy it manually.<xsl:template name="download">
<xsl:param name="truelevel"/>
<xsl:if test="metadata/attachments/entry/attachment">
<div class="bloc download">
<xsl:element name="h{$truelevel}"><i18n:text i18n:catalogue="plugin.odf" i18n:key="CONTENT_PROGRAM_ATTACHMENT"/></xsl:element>
<xsl:for-each select="metadata/attachments/entry">
<p>
<span class="file">
<a href="{resolver:resolve(attachment/@type, attachment/@path, 'true')}" title="{attachment/@filename} ({attachment/@size})">
<img class="icon" alt=""><xsl:attribute name="src"><xsl:value-of select="$uri-prefix"/><xsl:text>/plugins/explorer/icon/</xsl:text><xsl:value-of select="filenameutils:getExtension(attachment/@filename)"/><xsl:text>.png</xsl:text></xsl:attribute></img>
<xsl:choose>
<xsl:when test="normalize-space(attachment-text) != ''"> <xsl:value-of select="attachment-text"/></xsl:when>
<xsl:otherwise><xsl:value-of select="attachment/@filename"/></xsl:otherwise>
</xsl:choose>
</a>
<span class="size"> (<xsl:call-template name="format-size"><xsl:with-param name="size" select="attachment/@size"/></xsl:call-template>)</span>
</span>
</p>
</xsl:for-each>
</div>
</xsl:if>
</xsl:template>
<xsl:template name="download">
<xsl:param name="truelevel"/>
<xsl:if test="metadata/attachments/entry/attachment">
<div class="bloc download">
<xsl:element name="h{$truelevel}"><i18n:text i18n:catalogue="plugin.odf" i18n:key="CONTENT_PROGRAM_ATTACHMENT"/></xsl:element>
<xsl:for-each select="metadata/attachments/entry">
<p>
<span class="file">
<a href="{resolver:resolve(attachment/@type, attachment/@path, 'true')}" title="{attachment/@filename} ({attachment/@size})">
<img class="icon" alt=""><xsl:attribute name="src"><xsl:value-of select="$uri-prefix"/><xsl:text>/plugins/explorer/icon/</xsl:text><xsl:value-of select="filenameutils:getExtension(attachment/@filename)"/><xsl:text>.png</xsl:text></xsl:attribute></img>
<xsl:choose>
<xsl:when test="normalize-space(attachment-text) != ''"> <xsl:value-of select="attachment-text"/></xsl:when>
<xsl:otherwise><xsl:value-of select="attachment/@filename"/></xsl:otherwise>
</xsl:choose>
</a>
<span class="size"> (<xsl:call-template name="format-size"><xsl:with-param name="size" select="attachment/@size"/></xsl:call-template>)</span>
</span>
</p>
</xsl:for-each>
</div>
</xsl:if>
</xsl:template>
Voir le code
<xsl:template name="download">
<xsl:param name="truelevel"/>
<xsl:if test="metadata/attachments/entry/attachment">
<div class="bloc download">
<xsl:element name="h{$truelevel}"><i18n:text i18n:catalogue="plugin.odf" i18n:key="CONTENT_PROGRAM_ATTACHMENT"/></xsl:element>
<xsl:for-each select="metadata/attachments/entry">
<p>
<span class="file">
<a href="{resolver:resolve(attachment/@type, attachment/@path, 'true')}" title="{attachment/@filename} ({attachment/@size})">
<img class="icon" alt=""><xsl:attribute name="src"><xsl:value-of select="$uri-prefix"/><xsl:text>/plugins/explorer/icon/</xsl:text><xsl:value-of select="filenameutils:getExtension(attachment/@filename)"/><xsl:text>.png</xsl:text></xsl:attribute></img>
<xsl:choose>
<xsl:when test="normalize-space(attachment-text) != ''"> <xsl:value-of select="attachment-text"/></xsl:when>
<xsl:otherwise><xsl:value-of select="attachment/@filename"/></xsl:otherwise>
</xsl:choose>
</a>
<span class="size"> (<xsl:call-template name="format-size"><xsl:with-param name="size" select="attachment/@size"/></xsl:call-template>)</span>
</span>
</p>
</xsl:for-each>
</div>
</xsl:if>
</xsl:template>
The template XSL download in 2.0.x also displays an icon according to file type and size.
If you decide to include file size information, add the following template to handle different size formats (this template is used in the code above):
Attachment size format
Oops! Copy to clipboard failed. Open the code and copy it manually.<xsl:template name="format-size">
<xsl:param name="size"/>
<xsl:choose>
<xsl:when test="$size < 1024">
<i18n:translate>
<i18n:text i18n:key="CONTENT_PROGRAM_ATTACHMENTS_FILE_SIZE_BYTES"/>
<i18n:param><xsl:value-of select="$size"/></i18n:param>
</i18n:translate>
</xsl:when>
<xsl:when test="$size < (1024 * 1024)">
<i18n:translate>
<i18n:text i18n:key="CONTENT_PROGRAM_ATTACHMENTS_FILE_SIZE_KB"/>
<i18n:param><xsl:value-of select="round($size div 1024)"/></i18n:param>
</i18n:translate>
</xsl:when>
<xsl:otherwise>
<i18n:translate>
<i18n:text i18n:key="CONTENT_PROGRAM_ATTACHMENTS_FILE_SIZE_MB"/>
<i18n:param><xsl:value-of select="round($size div (1024 * 1024))"/></i18n:param>
</i18n:translate>
</xsl:otherwise>
</xsl:choose>
</xsl:template>
<xsl:template name="format-size">
<xsl:param name="size"/>
<xsl:choose>
<xsl:when test="$size < 1024">
<i18n:translate>
<i18n:text i18n:key="CONTENT_PROGRAM_ATTACHMENTS_FILE_SIZE_BYTES"/>
<i18n:param><xsl:value-of select="$size"/></i18n:param>
</i18n:translate>
</xsl:when>
<xsl:when test="$size < (1024 * 1024)">
<i18n:translate>
<i18n:text i18n:key="CONTENT_PROGRAM_ATTACHMENTS_FILE_SIZE_KB"/>
<i18n:param><xsl:value-of select="round($size div 1024)"/></i18n:param>
</i18n:translate>
</xsl:when>
<xsl:otherwise>
<i18n:translate>
<i18n:text i18n:key="CONTENT_PROGRAM_ATTACHMENTS_FILE_SIZE_MB"/>
<i18n:param><xsl:value-of select="round($size div (1024 * 1024))"/></i18n:param>
</i18n:translate>
</xsl:otherwise>
</xsl:choose>
</xsl:template>
Voir le code
<xsl:template name="format-size">
<xsl:param name="size"/>
<xsl:choose>
<xsl:when test="$size < 1024">
<i18n:translate>
<i18n:text i18n:key="CONTENT_PROGRAM_ATTACHMENTS_FILE_SIZE_BYTES"/>
<i18n:param><xsl:value-of select="$size"/></i18n:param>
</i18n:translate>
</xsl:when>
<xsl:when test="$size < (1024 * 1024)">
<i18n:translate>
<i18n:text i18n:key="CONTENT_PROGRAM_ATTACHMENTS_FILE_SIZE_KB"/>
<i18n:param><xsl:value-of select="round($size div 1024)"/></i18n:param>
</i18n:translate>
</xsl:when>
<xsl:otherwise>
<i18n:translate>
<i18n:text i18n:key="CONTENT_PROGRAM_ATTACHMENTS_FILE_SIZE_MB"/>
<i18n:param><xsl:value-of select="round($size div (1024 * 1024))"/></i18n:param>
</i18n:translate>
</xsl:otherwise>
</xsl:choose>
</xsl:template>
Training location(s) The place of training is now multiple
Display of training location in 1.1.x, 1.2.x and 1.3.x
Oops! Copy to clipboard failed. Open the code and copy it manually.<xsl:if test="metadata/place or metadata/place_remote">
<xsl:element name="h{$truelevel + 1}"><i18n:text i18n:catalogue="plugin.odf" i18n:key="CONTENT_PROGRAM_PLACE"/></xsl:element>
<p><xsl:call-template name="get-metadata-value"><xsl:with-param name="metadataName" select="'place'"/></xsl:call-template></p>
</xsl:if>
<xsl:if test="metadata/place or metadata/place_remote">
<xsl:element name="h{$truelevel + 1}"><i18n:text i18n:catalogue="plugin.odf" i18n:key="CONTENT_PROGRAM_PLACE"/></xsl:element>
<p><xsl:call-template name="get-metadata-value"><xsl:with-param name="metadataName" select="'place'"/></xsl:call-template></p>
</xsl:if>
<xsl:if test="metadata/place or metadata/place_remote">
<xsl:element name="h{$truelevel + 1}"><i18n:text i18n:catalogue="plugin.odf" i18n:key="CONTENT_PROGRAM_PLACE"/></xsl:element>
<p><xsl:call-template name="get-metadata-value"><xsl:with-param name="metadataName" select="'place'"/></xsl:call-template></p>
</xsl:if>
becomes
Displaying the location(s) of a 2.0.x training course
Oops! Copy to clipboard failed. Open the code and copy it manually.<xsl:if test="normalize-space(metadata/place) != ''">
<xsl:element name="h{$truelevel + 1}"><i18n:text i18n:catalogue="plugin.odf" i18n:key="CONTENT_PROGRAM_PLACE"/></xsl:element>
<ul>
<xsl:for-each select="metadata/place">
<li><xsl:value-of select="."/></li>
</xsl:for-each>
</ul>
</xsl:if>
<xsl:if test="normalize-space(metadata/place) != ''">
<xsl:element name="h{$truelevel + 1}"><i18n:text i18n:catalogue="plugin.odf" i18n:key="CONTENT_PROGRAM_PLACE"/></xsl:element>
<ul>
<xsl:for-each select="metadata/place">
<li><xsl:value-of select="."/></li>
</xsl:for-each>
</ul>
</xsl:if>
<xsl:if test="normalize-space(metadata/place) != ''">
<xsl:element name="h{$truelevel + 1}"><i18n:text i18n:catalogue="plugin.odf" i18n:key="CONTENT_PROGRAM_PLACE"/></xsl:element>
<ul>
<xsl:for-each select="metadata/place">
<li><xsl:value-of select="."/></li>
</xsl:for-each>
</ul>
</xsl:if>
Links to objects ODF The helper xsl org.ametys.plugins.odfweb.repository.OdfPagePathHelper has been removed. To display a link to a ODF object (training, course, ELP), use the general helper. org.ametys.cms.transformation.xslt.ResolveURIComponent and its method resolve.
Signature : String resolve(String type, String uri)
with
type : "odf"uri content identifier (training, course, elp)In the case of a ELP, theuri can be composed of the content identifier and the identifier of its parent separated by ";".
Link to a training course (e.g. "List of training courses" service) Link to training in 1.1.x, 1.2.x and 1.3.x
Oops! Copy to clipboard failed. Open the code and copy it manually.<li class="program">
<a href="{$odf-site-uri-prefix}/{$lang}/{/xml/programs/@root-page-path}/{degree/@code}/{@domain}/{@name}.html">
<xsl:value-of select="@title"/>
</a>
</li>
<li class="program">
<a href="{$odf-site-uri-prefix}/{$lang}/{/xml/programs/@root-page-path}/{degree/@code}/{@domain}/{@name}.html">
<xsl:value-of select="@title"/>
</a>
</li>
<li class="program">
<a href="{$odf-site-uri-prefix}/{$lang}/{/xml/programs/@root-page-path}/{degree/@code}/{@domain}/{@name}.html">
<xsl:value-of select="@title"/>
</a>
</li>
becomes
Link to a 2.0.x training course
Oops! Copy to clipboard failed. Open the code and copy it manually.<li class="program">
<a href="{resolver:resolve('odf', @id)}">
<xsl:value-of select="@title"/>
</a>
</li>
<li class="program">
<a href="{resolver:resolve('odf', @id)}">
<xsl:value-of select="@title"/>
</a>
</li>
<li class="program">
<a href="{resolver:resolve('odf', @id)}">
<xsl:value-of select="@title"/>
</a>
</li>
Link to a route Link to a route in 1.1.x, 1.2.x and 1.3.x
Oops! Copy to clipboard failed. Open the code and copy it manually.<xsl:template match="subprogram">
<li>
<a href="{odf:getSubProgramPath($siteName, /view/content/@language, @path, @id)}"><xsl:value-of select="@title"/></a>
</li>
</xsl:template>
<xsl:template match="subprogram">
<li>
<a href="{odf:getSubProgramPath($siteName, /view/content/@language, @path, @id)}"><xsl:value-of select="@title"/></a>
</li>
</xsl:template>
<xsl:template match="subprogram">
<li>
<a href="{odf:getSubProgramPath($siteName, /view/content/@language, @path, @id)}"><xsl:value-of select="@title"/></a>
</li>
</xsl:template>
becomes
Link to a 2.0.x course
Oops! Copy to clipboard failed. Open the code and copy it manually.<xsl:template match="subprogram">
<li>
<a href="{resolver:resolve('odf', @id)}"><xsl:value-of select="@title"/></a>
</li>
</xsl:template>
<xsl:template match="subprogram">
<li>
<a href="{resolver:resolve('odf', @id)}"><xsl:value-of select="@title"/></a>
</li>
</xsl:template>
<xsl:template match="subprogram">
<li>
<a href="{resolver:resolve('odf', @id)}"><xsl:value-of select="@title"/></a>
</li>
</xsl:template>
Links to a ELP Link to ELP in 1.1.x, 1.2.x and 1.3.x
Oops! Copy to clipboard failed. Open the code and copy it manually.<xsl:template match="course">
<li>
<a href="{odf:getCoursePath($siteName, /view/content/@language, @path, @id, $programId)}"><xsl:value-of select="@title"/></a>
</li>
</xsl:template>
<xsl:template match="course">
<li>
<a href="{odf:getCoursePath($siteName, /view/content/@language, @path, @id, $programId)}"><xsl:value-of select="@title"/></a>
</li>
</xsl:template>
<xsl:template match="course">
<li>
<a href="{odf:getCoursePath($siteName, /view/content/@language, @path, @id, $programId)}"><xsl:value-of select="@title"/></a>
</li>
</xsl:template>
becomes
Link to ELP in 2.0.x
Oops! Copy to clipboard failed. Open the code and copy it manually.<xsl:template match="course">
<li>
<a href="{resolver:resolve('odf', concat(@id, ';', /view/content/@id))}">
<xsl:value-of select="@title"/>
</a>
</li>
</xsl:template>
<xsl:template match="course">
<li>
<a href="{resolver:resolve('odf', concat(@id, ';', /view/content/@id))}">
<xsl:value-of select="@title"/>
</a>
</li>
</xsl:template>
<xsl:template match="course">
<li>
<a href="{resolver:resolve('odf', concat(@id, ';', /view/content/@id))}">
<xsl:value-of select="@title"/>
</a>
</li>
</xsl:template>