Notes
L’accès à cette page nécessite une autorisation. Vous pouvez essayer de vous connecter ou de modifier des répertoires.
L’accès à cette page nécessite une autorisation. Vous pouvez essayer de modifier des répertoires.
Remarque
Les blocs de script sont pris en charge uniquement dans .NET Framework. Ils ne sont pas pris en charge sur .NET Core ou .NET 5 ou version ultérieure.
La XslCompiledTransform classe prend en charge les scripts incorporés à l’aide de l’élément msxsl:script
. Lorsque la feuille de style est chargée, toutes les fonctions définies sont compilées en langage intermédiaire commun (CIL) par le modèle objet de document de code (CodeDOM) et exécutées pendant l’exécution. L’assembly généré à partir du bloc de script incorporé est distinct de l’assembly généré pour la feuille de style.
Activer le script XSLT
La prise en charge des scripts incorporés est un paramètre XSLT facultatif sur la XslCompiledTransform classe. La prise en charge des scripts est désactivée par défaut. Pour activer la prise en charge du script, créez un XsltSettings objet avec la EnableScript propriété définie sur true
et transmettez l’objet à la Load méthode.
Remarque
Le script XSLT ne doit être activé que si vous avez besoin d’une prise en charge de script et que vous travaillez dans un environnement entièrement approuvé.
msxsl:script : Définition de l'élément
L’élément msxsl:script
est une extension Microsoft à la recommandation XSLT 1.0 et a la définition suivante :
<msxsl:script language = "language-name" implements-prefix = "prefix of user namespace"> </msxsl:script>
Le préfixe msxsl
est lié à l'URI de l'espace de noms urn:schemas-microsoft-com:xslt
. La feuille de style doit inclure la déclaration de l'espace de noms xmlns:msxsl=urn:schemas-microsoft-com:xslt
.
L'attribut language
est facultatif. Sa valeur est le langage de code du bloc de code incorporé. Le langage est mappé au compilateur CodeDOM approprié à l’aide de la CodeDomProvider.CreateProvider méthode. La XslCompiledTransform classe peut prendre en charge n’importe quel langage Microsoft .NET, en supposant que le fournisseur approprié est installé sur l’ordinateur et est inscrit dans la section system.codedom du fichier machine.config. Si aucun language
attribut n’est spécifié, la langue est définie par défaut sur JScript. Le nom du langage ne respecte pas la casse : les termes « JavaScript » et « javascript » sont équivalents.
L’attribut implements-prefix
est obligatoire. Cet attribut est utilisé pour déclarer un espace de noms et l’associer au bloc de script. La valeur de cet attribut est le préfixe qui représente l’espace de noms. Ce préfixe peut être défini quelque part dans une feuille de style.
Remarque
Lorsque vous utilisez l’élément msxsl:script
, nous vous recommandons vivement de placer le script, quel que soit le langage, à l’intérieur d’une section CDATA. Étant donné que le script peut contenir des opérateurs, des identificateurs ou des délimiteurs pour un langage donné, s’il n’est pas contenu dans une section CDATA, il peut être mal interprété comme XML. Le code XML suivant montre un modèle de la section CDATA où le code peut être placé.
<msxsl:script implements-prefix='your-prefix' language='CSharp'>
<![CDATA[
// Code block.
]]>
</msxsl:script>
Fonctions de script
Les fonctions peuvent être déclarées dans l’élément msxsl:script
. Lorsqu’une fonction est déclarée, elle est contenue dans un bloc de script. Les feuilles de style peuvent contenir plusieurs blocs de script, chacun fonctionnant indépendamment de l’autre. Cela signifie que si vous exécutez à l’intérieur d’un bloc de script, vous ne pouvez pas appeler une fonction que vous avez définie dans un autre bloc de script, sauf s’il est déclaré avoir le même espace de noms et le même langage de script. Étant donné que chaque bloc de script peut se trouver dans sa propre langue et que le bloc est analysé conformément aux règles de grammaire de cet analyseur de langage, nous vous recommandons d’utiliser la syntaxe correcte pour la langue utilisée. Par exemple, si vous êtes dans un bloc de script Microsoft C#, utilisez la syntaxe de commentaire C#.
Les arguments fournis et les valeurs renvoyées à la fonction peuvent être de n’importe quel type. Étant donné que les types XPath W3C sont un sous-ensemble des types CLR (Common Language Runtime), la conversion de type a lieu sur les types qui ne sont pas considérés comme un type XPath. Le tableau suivant montre les types W3C correspondants et le type CLR équivalent.
Type de l'W3C | Type CLR |
---|---|
String |
String |
Boolean |
Boolean |
Number |
Double |
Result Tree Fragment |
XPathNavigator |
Node Set |
XPathNodeIterator |
Les types numériques CLR sont convertis en Double. Le DateTime type est converti en String. IXPathNavigable les types sont convertis en XPathNavigator. XPathNavigator[] est converti en XPathNodeIterator.
Tous les autres types génèrent une erreur.
Importation d'espaces de noms et d'assemblys
La XslCompiledTransform classe prédéfini un ensemble d’assemblys et d’espaces de noms pris en charge par défaut par l’élément msxsl:script
. Toutefois, vous pouvez utiliser des classes et des membres appartenant à un espace de noms qui ne figure pas dans la liste prédéfinie en important l’assembly et l’espace de noms dans le bloc msxsl:script
.
Assemblys
Les deux assemblages suivants sont référencés par défaut :
System.dll
System.Xml.dll
Microsoft.VisualBasic.dll (lorsque le langage de script est VB)
Vous pouvez importer les assemblys supplémentaires à l’aide de l’élément msxsl:assembly
. Cela comprend l'assembly lorsque la feuille de style est compilée. L’élément msxsl:assembly
a la définition suivante :
<msxsl:script>
<msxsl:assembly name="system.assemblyName" />
<msxsl:assembly href="path-name" />
<![CDATA[
// User code
]]>
</msxsl:script>
L’attribut name
contient le nom de l’assembly et l’attribut href
contient le chemin d’accès à l’assembly. Le nom de l’assembly peut être un nom complet, tel que « System.Data, Version=2.0.3600.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 » ou un nom court, tel que « System.Web ».
Espaces de noms
Les espaces de noms suivants sont inclus par défaut :
Système
System.Collection
System.Text
System.Text.RegularExpressions
System.Xml
System.Xml.Xsl
System.Xml.XPath
Microsoft.VisualBasic (lorsque le langage de script est VB)
Vous pouvez ajouter la prise en charge d’espaces de noms supplémentaires à l’aide de l’attribut namespace
. La valeur de l’attribut est le nom de l’espace de noms.
<msxsl:script>
<msxsl:using namespace="system.namespaceName" />
<![CDATA[
// User code
]]>
</msxsl:script>
Exemple :
L’exemple suivant utilise un script incorporé pour calculer la circonférence d’un cercle en fonction de son rayon.
using System;
using System.IO;
using System.Xml;
using System.Xml.XPath;
using System.Xml.Xsl;
public class Sample {
private const String filename = "number.xml";
private const String stylesheet = "calc.xsl";
public static void Main() {
// Compile the style sheet.
XsltSettings xslt_settings = new XsltSettings();
xslt_settings.EnableScript = true;
XslCompiledTransform xslt = new XslCompiledTransform();
xslt.Load(stylesheet, xslt_settings, new XmlUrlResolver());
// Load the XML source file.
XPathDocument doc = new XPathDocument(filename);
// Create an XmlWriter.
XmlWriterSettings settings = new XmlWriterSettings();
settings.OmitXmlDeclaration = true;
settings.Indent = true;
XmlWriter writer = XmlWriter.Create("output.xml", settings);
// Execute the transformation.
xslt.Transform(doc, writer);
writer.Close();
}
}
Imports System.IO
Imports System.Xml
Imports System.Xml.XPath
Imports System.Xml.Xsl
Public class Sample
Private Const filename As String = "number.xml"
Private Const stylesheet As String = "calc.xsl"
Public Shared Sub Main()
' Compile the style sheet.
Dim xslt_settings As XsltSettings = New XsltSettings()
xslt_settings.EnableScript = true
Dim xslt As XslCompiledTransform = New XslCompiledTransform()
xslt.Load(stylesheet, xslt_settings, New XmlUrlResolver())
' Load the XML source file.
Dim doc As XPathDocument = New XPathDocument(filename)
' Create an XmlWriter.
Dim settings As XmlWriterSettings = New XmlWriterSettings()
settings.OmitXmlDeclaration = true
settings.Indent = true
Dim writer As XmlWriter = XmlWriter.Create("output.xml", settings)
' Execute the transformation.
xslt.Transform(doc, writer)
writer.Close()
End Sub
End Class
number.xml
<?xml version='1.0'?>
<data>
<circle>
<radius>12</radius>
</circle>
<circle>
<radius>37.5</radius>
</circle>
</data>
calc.xsl
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:msxsl="urn:schemas-microsoft-com:xslt"
xmlns:user="urn:my-scripts">
<msxsl:script language="C#" implements-prefix="user">
<![CDATA[
public double circumference(double radius){
double pi = 3.14;
double circ = pi*radius*2;
return circ;
}
]]>
</msxsl:script>
<xsl:template match="data">
<circles>
<xsl:for-each select="circle">
<circle>
<xsl:copy-of select="node()"/>
<circumference>
<xsl:value-of select="user:circumference(radius)"/>
</circumference>
</circle>
</xsl:for-each>
</circles>
</xsl:template>
</xsl:stylesheet>
Sortie
<circles xmlns:msxsl="urn:schemas-microsoft-com:xslt" xmlns:user="urn:my-scripts">
<circle>
<radius>12</radius>
<circumference>75.36</circumference>
</circle>
<circle>
<radius>37.5</radius>
<circumference>235.5</circumference>
</circle>
</circles>
Voir aussi
- transformations XSLT
- Génération et compilation de code source dynamique