Nota
El acceso a esta página requiere autorización. Puede intentar iniciar sesión o cambiar directorios.
El acceso a esta página requiere autorización. Puede intentar cambiar los directorios.
Nota:
Los bloques de script solo se admiten en .NET Framework. No se admiten en .NET Core o .NET 5 o versiones posteriores.
La XslCompiledTransform clase admite scripts incrustados mediante el msxsl:script
elemento . Cuando se carga la hoja de estilos, las funciones definidas se compilan en lenguaje intermedio común (CIL) por el Modelo de objetos de documento de código (CodeDOM) y se ejecutan durante el tiempo de ejecución. El ensamblado generado a partir del bloque de script incrustado es independiente del ensamblado generado para la hoja de estilos.
Habilitación del script XSLT
La compatibilidad con scripts incrustados es una configuración XSLT opcional en la XslCompiledTransform clase . La compatibilidad con scripts está deshabilitada de forma predeterminada. Para habilitar la compatibilidad con scripts, cree un XsltSettings objeto con la EnableScript propiedad establecida en true
y pase el objeto al Load método .
Nota:
El scripting XSLT solo debe habilitarse si necesita compatibilidad con scripts y está trabajando en un entorno de plena confianza.
msxsl:script Definición del Elemento
El msxsl:script
elemento es una extensión de Microsoft para la recomendación XSLT 1.0 y tiene la siguiente definición:
<msxsl:script language = "language-name" implements-prefix = "prefix of user namespace"> </msxsl:script>
El msxsl
prefijo está enlazado al URI del urn:schemas-microsoft-com:xslt
espacio de nombres. La hoja de estilos debe incluir la declaración del espacio de nombres xmlns:msxsl=urn:schemas-microsoft-com:xslt
.
El atributo language
es opcional. Su valor es el lenguaje de código del bloque de código incrustado. El lenguaje se asigna al compilador CodeDOM adecuado mediante el CodeDomProvider.CreateProvider método . La XslCompiledTransform clase puede admitir cualquier lenguaje de Microsoft .NET, suponiendo que el proveedor adecuado esté instalado en el equipo y esté registrado en la sección system.codedom del archivo machine.config. Si no se especifica un language
atributo, el lenguaje tiene como valor predeterminado JScript. El nombre del lenguaje no distingue mayúsculas de minúsculas, por lo que "JavaScript" y "javascript" son equivalentes.
El implements-prefix
atributo es obligatorio. Este atributo se usa para declarar un espacio de nombres y asociarlo al bloque de script. El valor de este atributo es el prefijo que representa el espacio de nombres. Este prefijo se puede definir en algún lugar de una hoja de estilos.
Nota:
Al usar el msxsl:script
elemento , se recomienda encarecidamente que el script, independientemente del lenguaje, se coloque dentro de una sección CDATA. Dado que el script puede contener operadores, identificadores o delimitadores para un lenguaje determinado, si no está incluido en una sección CDATA, tiene la posibilidad de interpretarse erróneamente como XML. El siguiente XML muestra una plantilla de la sección CDATA donde se puede colocar el código.
<msxsl:script implements-prefix='your-prefix' language='CSharp'>
<![CDATA[
// Code block.
]]>
</msxsl:script>
Funciones de script
Las funciones se pueden declarar dentro del msxsl:script
elemento . Cuando se declara una función, se encuentra en un bloque de script. Las hojas de estilos pueden contener varios bloques de script, cada uno de los cuales funciona independientemente del otro. Esto significa que si se ejecuta código desde un bloque de scripts, no podrá llamar a una función definida en otro bloque a menos que se haya declarado en el mismo espacio de nombres y con el mismo lenguaje de scripts. Dado que cada bloque de script puede estar en su propio idioma y el bloque se analiza según las reglas gramaticales de ese analizador de lenguaje, se recomienda usar la sintaxis correcta para el lenguaje en uso. Por ejemplo, si se encuentra en un bloque de código C#, use la sintaxis de comentarios de C#.
Los argumentos proporcionados y los valores devueltos a la función pueden ser de cualquier tipo. Dado que los tipos XPath de W3C son un subconjunto de los tipos de Common Language Runtime (CLR), la conversión de tipos tiene lugar en tipos que no se consideran un tipo XPath. En la tabla siguiente se muestran los tipos W3C correspondientes y el tipo CLR equivalente.
Tipo W3C | Tipo CLR |
---|---|
String |
String |
Boolean |
Boolean |
Number |
Double |
Result Tree Fragment |
XPathNavigator |
Node Set |
XPathNodeIterator |
Los tipos numéricos CLR se convierten en Double. El DateTime tipo se convierte en String. IXPathNavigable Los tipos se convierten en XPathNavigator. XPathNavigator[] se convierte en XPathNodeIterator.
El resto de los tipos inician un error.
Importación de espacios de nombres y ensamblajes
La clase `XslCompiledTransform` predefine un conjunto de ensamblados y espacios de nombres que son admitidos de forma predeterminada por el elemento `msxsl:script
`. Sin embargo, puede usar clases y miembros que pertenecen a un espacio de nombres que no están en la lista predefinida importando el ensamblado y el espacio de nombres en el bloque msxsl:script
.
Ensamblados
De forma predeterminada, se hace referencia a los dos ensamblados siguientes:
System.dll
System.Xml.dll
Microsoft.VisualBasic.dll (cuando el lenguaje de script es VB)
Puede importar los ensamblados adicionales mediante el msxsl:assembly
elemento . Esto incluye el ensamblaje cuando se compila la hoja de estilos. El msxsl:assembly
elemento tiene la siguiente definición:
<msxsl:script>
<msxsl:assembly name="system.assemblyName" />
<msxsl:assembly href="path-name" />
<![CDATA[
// User code
]]>
</msxsl:script>
El name
atributo contiene el nombre del ensamblado y el href
atributo contiene la ruta de acceso al ensamblado. El nombre del ensamblado puede ser un nombre completo, como "System.Data, Version=2.0.3600.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" o un nombre corto, como "System.Web".
Espacios de nombres
Los siguientes espacios de nombres se incluyen de forma predeterminada:
Sistema
System.Collection
System.Text
System.Text.RegularExpressions
System.Xml
System.Xml.Xsl
System.Xml.Xpath
Microsoft.VisualBasic (cuando el lenguaje de script es VB)
Puede agregar compatibilidad con espacios de nombres adicionales mediante el namespace
atributo . El valor del atributo es el nombre del espacio de nombres.
<msxsl:script>
<msxsl:using namespace="system.namespaceName" />
<![CDATA[
// User code
]]>
</msxsl:script>
Ejemplo
En el ejemplo siguiente se usa un script incrustado para calcular la circunferencia de un círculo dado su radio.
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>
Salida
<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>