Partager via


Exemple 1 de <xsl:apply-imports>

Cet exemple illustre l'utilisation de <xsl:apply-imports> afin de réutiliser du code plus efficacement. L'exemple utilise quatre fichiers principaux :

  • Fichier XML source, ops.xml. Ce fichier de données définit trois opérations : add (+), sub (-) et mul (*).

  • Feuille de style XSLT principale, ops.xsl. Ce fichier contient les règles de modèle pour les opérations, notamment deux éléments <xsl:import>. Les feuilles de style importées effectuent des opérations arithmétiques et de chaîne sur une source de données précise.

  • Feuille de style importée, arith.xsl. Ce fichier XSLT effectue des opérations arithmétiques sur chaque élément <op>.

  • Autre feuille de style importée, str.xsl. Ce fichier XSLT effectue des opérations de chaîne personnalisées. Dans ce cas, add (+) est traité comme une concaténation de chaînes ; par exemple, 1+2 devient 12. De même, mul (*) est traité comme une concaténation inverse ; 1*2 devient 21. Notez que sub (-) est une opération de chaîne non définie.

Fichier XML (ops.xml)

<?xml version="1.0"?>
<?xml-stylesheet type="text/xsl" href="ops.xsl"?>
<ops>
  <desc>Some binary operations</desc>
  <op name="add" symbol="+">
    <operand>1</operand>
    <operand>2</operand>
  </op>
  <op name="sub" symbol="-">
    <operand>1</operand>
    <operand>2</operand>
  </op>
  <op name="mul" symbol="*">
    <operand>1</operand>
    <operand>2</operand>
  </op>
</ops>

Fichier XSLT principal (ops.xsl)

<?xml version="1.0"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
                version="1.0">
  <xsl:import href="arith.xsl"/>
  <xsl:import href="str.xsl"/>
  <xsl:template match="op">
    <xsl:value-of select="operand[1]"/>
    <xsl:value-of select="@symbol"/>
    <xsl:value-of select="operand[2]"/>
    = <xsl:apply-imports/>
    <br/>
  </xsl:template>
</xsl:stylesheet>

Fichier XSLT importé (arith.xsl)

<?xml version="1.0"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
                version="1.0">
  <xsl:template match="op[@symbol='+']">
    <xsl:value-of select="sum(operand)"/> (from arith.xsl)
  </xsl:template>
  <xsl:template match="op[@symbol='-']">
    <xsl:value-of select="number(operand[1])-number(operand[2])"/> 
   (from arith.xsl)
  </xsl:template>
  <xsl:template match="op[@symbol='*']">
    <xsl:value-of select="number(operand[1])*number(operand[2])"/> 
    (from arith.xsl)
  </xsl:template>
</xsl:stylesheet>

Fichier XSLT importé (str.xsl)

<?xml version="1.0"?>
  <xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
                  version="1.0">
  <xsl:template match="desc">
    <DIV><xsl:value-of select="."/></DIV>
  </xsl:template>
  <xsl:template match="op[@name='add']">
    <xsl:value-of select="operand[1]"/>
    <xsl:value-of select="operand[2]"/> (from str.xsl)
  </xsl:template>
  <xsl:template match="op[@name='mul']">
    <xsl:value-of select="operand[2]"/>
    <xsl:value-of select="operand[1]"/> (from str.xsl)
  </xsl:template>
</xsl:stylesheet>

Sortie

Vous devez obtenir la sortie suivante :

Some binary operations

1+2 = 12 (from str.xsl)

1-2 = -1 (from arith.xsl)

1*2 = 21 (from str.xsl)

Notes

La dernière feuille de style importée possède la plus haute priorité d'importation. Dans cet exemple, str.xsl est importé en dernier et a donc une priorité d'importation supérieure à celle d'arith.xsl. Les deux feuilles de style importées ont des modèles pour les opérations add et mul. Seuls sont appelés ceux de str.xsl. L'opération sub définie dans arith.xsl est cependant utilisée, car aucune opération sub n'est définie dans str.xsl. Supposons que nous inversons l'ordre des éléments <xsl:import> dans le fichier XSLT principal, comme suit :

<xsl:import href="str.xsl"/>

<xsl:import href="arith.xsl"/>

Dans ce cas, la sortie doit être la suivante :

Some binary operations

1+2 = 3 (from arith.xsl)

1-2 = -1 (from arith.xsl)

1*2 = 2 (from arith.xsl)

En outre, si l'instruction <xsl:apply-imports/> est absente de la règle de modèle prédominante pour <op> dans le fichier XSLT principal (ops.xsl), la sortie devient :

Some binary operations

1+2 =

1-2 =

1*2 =

Autrement dit, la règle de modèle de la feuille de style de destination prévaut sur les règles de modèle apparentées des feuilles de style importées. L'instruction <xsl:apply-imports/> permet de réactiver ces règles de modèle remplacées d'une autre manière.