Écriture de scripts de feuille de style XSLT à l'aide de <msxsl:script>
La classe XslTransform prend en charge les scripts incorporés en utilisant l'élément script.
Remarque |
---|
La classe XslTransform est obsolète dans le .NET Framework version 2.0.Vous pouvez effectuer des transformations XSLT (Extensible Stylesheet Language Transformation) à l'aide de la classe XslCompiledTransform.Pour plus d'informations, voir Utilisation de la classe XslCompiledTransform et Migration depuis la classe XslTransform. |
La classe XslTransform prend en charge les scripts incorporés en utilisant l'élément script. Lorsque la feuille de style est chargée, toute fonction définie est compilée en langage MSIL (Microsoft Intermediate Language) par son enveloppement dans une définition de classe et n'engendre aucune perte des performances.
L'élément <msxsl:script> est défini ci-après :
<msxsl:script language = "language-name" implements-prefix = "prefix of user namespace"> </msxsl:script>
où msxsl est un préfixe lié à l'espace de noms urn:schemas-microsoft-com:xslt.
L'attribut language n'est pas obligatoire mais, s'il est spécifié, sa valeur doit être l'une des suivantes : C#, VB, JScript, JavaScript, VisualBasic ou CSharp. Lorsqu'il n'est pas spécifié, le langage par défaut est JScript. Le language-name 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. Cet espace de noms peut être défini à un endroit d'une feuille de style.
Dans la mesure où l'élément msxsl:script appartient à l'espace de noms urn:schemas-microsoft-com:xslt, la feuille de style doit inclure la déclaration d'espaces de noms xmlns:msxsl=urn:schemas-microsoft-com:xslt.
Si l'appelant du script ne possède pas l'autorisation d'accès UnmanagedCode, le script dans une feuille de style ne se compilera jamais et l'appel à Load échouera.
Si l'appelant possède une autorisation UnmanagedCode, le script se compile, mais les opérations autorisées sont dépendantes des preuves fournies au moment du chargement.
Si vous utilisez l'une des méthodes Load qui prennent un objet XmlReader ou un objet XPathNavigator pour charger la feuille de style, vous devez utiliser la surcharge Load qui prend un paramètre Evidence. Pour fournir des preuves, l'appelant doit avoir l'autorisation ControlEvidence pour fournir Evidence à l'assembly script. Si l'appelant n'a pas cette autorisation, il peut attribuer la valeur null au paramètre Evidence. Cela entraîne l'échec de la fonction Load si le script n'est pas trouvé. L'autorisation ControlEvidence est considérée comme une autorisation très puissante qui ne doit être accordée qu'au code d'un niveau de confiance élevé.
Pour obtenir la preuve de votre assembly, utilisez this.GetType().Assembly.Evidence. Pour obtenir la preuve d'un URI (Uniform Resource Identifier), utilisez Evidence e = XmlSecureResolver.CreateEvidenceForUrl(stylesheetURI).
Si vous utilisez les méthodes Load qui prennent un objet XmlResolver mais aucun Evidence, la zone de sécurité pour l'assembly prend la valeur Confiance totale par défaut. Pour plus d'informations, voir SecurityZone et Jeux d'autorisations nommés.
Les fonctions peuvent être déclarées dans l'élément msxsl:script. Le tableau suivant montre les espaces de noms qui sont pris en charge par défaut. Vous pouvez utiliser des classes en dehors des espaces de noms répertoriés. Toutefois, ces classes doivent être qualifiées complètes.
Espaces de noms par défaut |
Description |
---|---|
System |
Classe système. |
System.Collection |
Classes de collection. |
System.Text |
Classes de texte. |
System.Text.RegularExpressions |
Classes d'expressions régulières. |
System.Xml |
Classes XML principales. |
System.Xml.Xsl |
Classes XSLT. |
System.Xml.XPath |
Classes XML Path Language (XPath). |
Microsoft.VisualBasic |
Classes pour les scripts Microsoft Visual Basic. |
Lorsqu'une fonction est déclarée, elle est contenue dans un bloc de script. Les feuilles de style peuvent contenir plusieurs blocs de scripts, chacun fonctionnant indépendamment des autres. Ainsi, si vous êtes en cours d'exécution dans un bloc de script, vous ne pouvez pas appeler une fonction que vous avez définie dans un autre bloc de script, sauf si elle est déclarée comme possédant le même espace de noms et le même langage de script. Puisque chaque bloc de script peut être écrit dans son propre langage et que le bloc est analysé en fonction des règles grammaticales de cet analyseur de langage, vous devez utiliser la syntaxe correcte pour la langue utilisée. Par exemple, il n'est pas correct d'utiliser un nœud de commentaire XML <!-- an XML comment --> dans un bloc de script C#.
Les arguments fournis et les valeurs de retour définies par les fonctions du script doivent être l'un des types définis par le World Wide Web Consortium (W3C), XPath ou XSLT. Le tableau suivant illustre les types W3C correspondants, les classes .NET Framework équivalentes (Type), et précise si le type W3C est un XPath ou XSLT.
Type |
Classe équivalente .NET Framework (type) |
Type XPath ou type XSLT |
---|---|---|
String |
System.String |
XPath |
Boolean |
System.Boolean |
XPath |
Number |
System.Double |
XPath |
Result Tree Fragment |
System.Xml.XPath.XPathNavigator |
XSLT |
Collection de nœuds |
System.Xml.XPath.XPathNodeIterator |
XPath |
Si la fonction de script utilise l'un des types numériques suivants : Int16, UInt16, Int32, UInt32, Int64, UInt64, Single ou Decimal, ils deviennent Double, ce qui effectue un mappage sur le nombre de type XPath W3C. Tous les autres types deviennent une chaîne à l'aide de la méthode ToString.
Si la fonction de script utilise un type différent de ceux mentionnés ci-avant ou si la fonction ne se compile pas lorsque la feuille de style est chargée dans l'objet XslTransform, une exception est levée.
Lors de l'utilisation de l'élément msxsl:script, il est vivement recommandé de placer le script (quel que soit son langage) dans une section CDATA. Par exemple, le langage XML suivant illustre le modèle de la section CDATA dans laquelle est placé votre code.
<msxsl:script implements-prefix='yourprefix' language='CSharp'>
<![CDATA[
... your code here ...
]]>
</msxsl:script>
Il est vivement recommandé de placer tout le contenu du script dans une section CDATA car les opérateurs, les identificateurs ou les délimiteurs d'un langage donné peuvent être mal interprétés en tant que XML. L'exemple suivant illustre l'utilisation de l'opérateur AND logique dans le script.
<msxsl:script implements-prefix='yourprefix' language='CSharp>
public string book(string abc, string xyz)
{ if ((abc== abc)&&(abc== xyz)) return bar+xyz;
else return null;
}
</msxsl:script>
Cela lève une exception car les signes & ne font pas l'objet d'un échappement. Le document est chargé en tant que XML et aucun traitement spécial n'est appliqué au texte entre les balises d'élément msxsl:script.
Exemple
L'exemple suivant utilise un script incorporé pour calculer la circonférence d'un cercle en fonction de son rayon.
Imports System
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()
'Create the XslTransform and load the style sheet.
Dim xslt As XslTransform = New XslTransform
xslt.Load(stylesheet)
'Load the XML data file.
Dim doc As XPathDocument = New XPathDocument(filename)
'Create an XmlTextWriter to output to the console.
Dim writer As XmlTextWriter = New XmlTextWriter(Console.Out)
writer.Formatting = Formatting.Indented
'Transform the file.
xslt.Transform(doc, Nothing, writer, Nothing)
writer.Close()
End Sub
End Class
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() {
//Create the XslTransform and load the style sheet.
XslTransform xslt = new XslTransform();
xslt.Load(stylesheet);
//Load the XML data file.
XPathDocument doc = new XPathDocument(filename);
//Create an XmlTextWriter to output to the console.
XmlTextWriter writer = new XmlTextWriter(Console.Out);
writer.Formatting = Formatting.Indented;
//Transform the file.
xslt.Transform(doc, null, writer, null);
writer.Close();
}
}
Entrée
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>
Output
<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
Concepts
Implémentation du processeur XSLT par la classe XslTransform