Commentaire sur la fiche : Exemple d’une règle XSLT personnalisée dans custom/import.xsl
Si la réponse à cette question ne vous parait pas claire ou si elle vous semble obsolète, n’hésitez pas à nous en faire part.
Et nous sommes preneurs également de toute correction de faute d’orthographe ou de grammaire...
Rappel du texte de la fiche :
Pour répondre à cet objectif, deux mécanismes vont être mis en place :
Le premier mécanisme se situe au niveau des normes de saisie d’une fiches. Lors qu’un fichier est spécifié avec son chemin relatif, l’attribut syntax est utilisé : [`(syntax=path) js/bdf/Bdf.js]. L’idée est de rajouter un autre attribut appelé project qui aura la valeur rsc. Ces deux valeurs sont totalement arbitraires et relèvent d’un simple choix éditorial.
Ce qui nous donne la forme suivante : [`(project=rsc syntax=path) js/bdf/Bdf.js].
Sans autre intervention, le rajout de cet attribut n’a aucune conséquence visible (il rajoute cependant un attribut @project="src" à la balise <code> mais les navigateurs ne se formalisent pas de cette entorse au HTML 5).
C’est là qu’intervient le deuxième mécanisme : une règle présente dans custom/import.xsl qui va traiter ce cas particulier. La règle se présente de cette façon :
<xsl:template match="s[@type='code'][@att-project='rsc']">
<code>
<xsl:for-each select="@*[name() != 'att-hreflang' and name() != 'att-rel' and name() != 'att-target' and name() != 'att-project' and starts-with(name(), 'att-')]">
<xsl:attribute name="{substring(name(), 5)}"><xsl:value-of select="."/></xsl:attribute>
</xsl:for-each>
<a href="https://framagit.org/fichotheque/bdf/-/blob/master/BdfServer_Resources/src/fr/exemole/bdfserver/resources/{.}" class="fbe-link-Cdata">
<xsl:if test="string-length($EXTERNALTARGET) > 0 and @att-target = false()">
<xsl:attribute name="target"><xsl:value-of select="$EXTERNALTARGET"/></xsl:attribute>
</xsl:if>
<xsl:apply-templates select="." mode="ficheblock-span-Content"/>
</a>
</code>
</xsl:template>On voit que la règle @match="s[@type='code'][@att-project='rsc']" concerne les blocs de caractères de type code dont l’attribut @att-project a pour valeur rsc (dans le format XML d’une section de texte les attributs arbitraires comme project sont préfixés par @att-. Cette règle construit alors automatiquement un lien <a> vers le site du dépôt GIT.
On comprendra que l’avantage de cette méthode, c’est que l’adresse du dépôt n’est indiquée qu’à un seul endroit, ce qui facilitera la maintenance en cas de changement de dépôt.
Cette exemple ne fonctionne que pour les ressources contenues dans BdfServer_Resources/src/fr/exemole/bdfserver/resources/. Qu’en est-il des autres fichiers du dépôt et en particulier des classes Java qui constituent 90% du contenu ?
L’idée est alors d’adapter les deux mécanismes pour les classes Java sous la forme [`(project=BdfServer syntax=java-interface) fr.exemole.bdfserver.api.BdfServer]. Ici, project prend pour valeur le projet dans lequel est la classe.
La règle personnalisée est alors la suivante :
<xsl:template match="s[@type='code'][@att-project]">
<xsl:variable name="javapath">
<xsl:call-template name="utils-replaceInText">
<xsl:with-param name="param_Text" select="." />
<xsl:with-param name="param_Target" select="'.'" />
<xsl:with-param name="param_Replacement" select="'/'" />
</xsl:call-template>
</xsl:variable>
<code>
<xsl:for-each select="@*[name() != 'att-hreflang' and name() != 'att-rel' and name() != 'att-target' and name() != 'att-project' and starts-with(name(), 'att-')]">
<xsl:attribute name="{substring(name(), 5)}"><xsl:value-of select="."/></xsl:attribute>
</xsl:for-each>
<a href="https://framagit.org/fichotheque/bdf/-/blob/master/{@att-project}/src/{$javapath}.java" class="fbe-link-Cdata">
<xsl:if test="string-length($EXTERNALTARGET) > 0 and @att-target = false()">
<xsl:attribute name="target"><xsl:value-of select="$EXTERNALTARGET"/></xsl:attribute>
</xsl:if>
<xsl:apply-templates select="." mode="ficheblock-span-Content"/>
</a>
</code>
</xsl:template>La règle est sensiblement la même que la règle précédente avec une différence dans le XPATH : c’est la présence de @att-project qui compte quelque soit la valeur. La règle comprend également une étape supplémentaire au début : l’appel à la règle <xsl:call-template name="utils-replaceInText">, c’est une règle utilitaire définie dans xslt/v2/catalogs/utils.xsl qui effectue le remplacement des points . par des cotices /. Cette règle pallie à l’absence d’une fonction replace() dans XSLT 1.0.
Cela donne le résultat suivant : fr.exemole.bdfserver.api.BdfServer