XsltArgumentList para parámetros Stylesheet y objetos de extensión
Actualización: November 2007
La clase XsltArgumentList contiene parámetros Extensible Stylesheet Language for Transformations (XSLT) y objetos de extensión XSLT. Cuando se pasan al método Transform se puede invocar a estos parámetros y objetos de extensión desde hojas de estilos.
Nota: |
---|
Las clases XslTransform y XsltArgumentList son obsoletas en .NET Framework versión 2.0. Puede llevar a cabo transformaciones XSLT mediante la clase XslCompiledTransform. Para obtener más información, vea Uso de la clase XslCompiledTransform y Migración desde la clase XslTransform. |
La clase XsltArgumentList contiene parámetros XSLT y objetos de extensión de XSLT. Cuando se pasan al método Transform se puede invocar a estos parámetros y objetos de extensión desde hojas de estilos.
A continuación se enumeran las ventajas de pasar un objeto en lugar de utilizar un script incrustado:
Proporciona una mejor encapsulación y reutilización de clases.
Permite que las hojas de estilos sean más pequeñas y facilita su mantenimiento.
Admite llamadas a métodos en clases que pertenecen a otros espacios de nombres distintos de los definidos dentro del conjunto de espacios de nombres admitidos por el sistema System.
Permite que se pasen fragmentos de árboles de resultados a la hoja de estilos con el uso de XPathNodeIterator.
Parámetros de XSLT de hojas de estilos
Los parámetros XSLT se añaden a XsltArgumentList mediante el método AddParam. En ese momento se asocian un nombre completo y un identificador de recursos de uniforme (URI) de espacio de nombres con el objeto del parámetro.
El objeto del parámetro debería corresponder al tipo World Wide Web Consortium (W3C). La tabla siguiente muestra los correspondientes tipos W3C, las clases .NET Framework equivalentes (tipo), y si el tipo W3C es un tipo de lenguaje de ruta XML (XPath) o tipo XSLT.
Tipo W3C |
Clase equivalente .NET Framework (tipo) |
Tipo de XPath o tipo XSLT |
---|---|---|
Cadena |
System.String |
XPath |
Booleano |
System.Boolean |
XPath |
Número |
System.Double |
XPath |
Fragmento del árbol de resultados |
System.Xml.XPath.XPathNavigator |
XSLT |
Conjunto de nodos |
System.Xml.XPath.XPathNodeIterator |
XPath |
Si el objeto del parámetro no es una de las clases anteriores, se obliga a que sea Double o String, según corresponda. Los tipos Int16, UInt16, Int32, UInt32, Int64, UInt64, Single y Decimal se convierten obligatoriamente a Double. Todos los demás tipos se convierten obligatoriamente a String con el método ToString.
Para utilizar el parámetro XSLT, el usuario debe seguir los pasos siguientes:
Crear XsltArgumentList y añadir los objetos mediante AddParam.
Llamar a los parámetros desde la hoja de estilos.
Pasar XsltArgumentList al método Transform.
Ejemplo
En el ejemplo siguiente se utiliza el método AddParam para crear un parámetro que almacena la fecha de descuento calculada. Para calcular la fecha de descuento se deben sumar 20 días a partir de la fecha del pedido.
Imports System
Imports System.IO
Imports System.Xml
Imports System.Xml.XPath
Imports System.Xml.Xsl
Public class Sample
Private Const filename As String = "order.xml"
Private Const stylesheet As String = "discount.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 XsltArgumentList.
Dim xslArg As XsltArgumentList = New XsltArgumentList
'Calculate the discount date.
Dim today As DateTime = DateTime.Now
Dim d As DateTime = today.AddDays(20)
xslArg.AddParam("discount", "", d.ToString())
'Create an XmlTextWriter to handle the output.
Dim writer As XmlTextWriter = New XmlTextWriter("orderout.xml", Nothing)
'Transform the file.
xslt.Transform(doc, xslArg, 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 = "order.xml";
private const String stylesheet = "discount.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 XsltArgumentList.
XsltArgumentList xslArg = new XsltArgumentList();
//Calculate the discount date.
DateTime today = DateTime.Now;
DateTime d = today.AddDays(20);
xslArg.AddParam("discount", "", d.ToString());
//Create an XmlTextWriter to handle the output.
XmlTextWriter writer = new XmlTextWriter("orderout.xml", null);
//Transform the file.
xslt.Transform(doc, xslArg, writer, null);
writer.Close();
}
}
Entrada
order.xml
<!--Represents a customer order-->
<order>
<book ISBN='10-861003-324'>
<title>The Handmaid's Tale</title>
<price>19.95</price>
</book>
<cd ISBN='2-3631-4'>
<title>Americana</title>
<price>16.95</price>
</cd>
</order>
discount.xsl
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:param name="discount"/>
<xsl:template match="/">
<order>
<xsl:variable name="sub-total" select="sum(//price)"/>
<total><xsl:value-of select="$sub-total"/></total>
15% discount if paid by: <xsl:value-of select="$discount"/>
</order>
</xsl:template>
</xsl:stylesheet>
Resultados
<order>
<total>36.9</total>
15% discount if paid by: 5/6/2001 5:01:15 PM
</order>
Objetos de extensión de XSLT
Los objetos de extensión XSLT se añaden a XsltArgumentList mediante el método AddExtensionObject. En ese momento se asocian un nombre completo y un identificador URI de espacio de nombres con el objeto de extensión.
Cuando se agrega un objeto, el llamador de AddExtensionObject debe ser de confianza total en la directiva de seguridad. Si el llamador es de confianza parcial, la adición producirá errores.
El hecho de que un objeto se agregue correctamente, no garantiza que la ejecución vaya a producirse correctamente. Cuando se llama al método Transform, los permisos se calculan con la evidencia proporcionada durante la ejecución del método Load y dicho conjunto de permisos se asigna a todo el proceso de transformación. Si un objeto de extensión intenta iniciar una acción que requiere permisos que no se han encontrado en el conjunto, se inicia una excepción.
Los tipos de datos devueltos desde los objetos de extensión pertenecen a uno de los cuatro tipos de datos básicos de Xpath: datos de tipo numérico, datos de tipo cadena, datos booleanos y conjuntos de nodos.
Para utilizar objetos de extensión de XSLT, el usuario debe seguir los pasos siguientes:
Crear XsltArgumentList y añadir el objeto de extensión mediante AddExtensionObject.
Invocar al objeto de extensión desde la hoja de estilos.
Pasar XsltArgumentList al método Transform.
Ejemplo
En el ejemplo siguiente se calcula la longitud de una circunferencia dado su radio.
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 = "circle.xsl"
Public Shared Sub Main()
Dim test As Sample = New Sample
End Sub
Public Sub New()
'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 XsltArgumentList.
Dim xslArg As XsltArgumentList = New XsltArgumentList
'Add an object to calculate the circumference of the circle.
Dim obj As Calculate = New Calculate
xslArg.AddExtensionObject("urn:myObj", obj)
'Create an XmlTextWriter to output to the console.
Dim writer As XmlTextWriter = New XmlTextWriter(Console.Out)
'Transform the file.
xslt.Transform(doc, xslArg, writer, Nothing)
writer.Close()
End Sub
'Calculates the circumference of a circle given the radius.
Public Class Calculate
Private circ As double = 0
Public Function Circumference(radius As Double) As Double
circ = Math.PI*2*radius
Return circ
End Function
End Class
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 = "circle.xsl";
public static void Main() {
Sample test = new Sample();
}
public Sample() {
//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 XsltArgumentList.
XsltArgumentList xslArg = new XsltArgumentList();
//Add an object to calculate the circumference of the circle.
Calculate obj = new Calculate();
xslArg.AddExtensionObject("urn:myObj", obj);
//Create an XmlTextWriter to output to the console.
XmlTextWriter writer = new XmlTextWriter(Console.Out);
//Transform the file.
xslt.Transform(doc, xslArg, writer, null);
writer.Close();
}
//Calculates the circumference of a circle given the radius.
public class Calculate{
private double circ = 0;
public double Circumference(double radius){
circ = Math.PI*2*radius;
return circ;
}
}
}
Entrada
number.xml
<?xml version='1.0'?>
<data>
<circle>
<radius>12</radius>
</circle>
<circle>
<radius>37.5</radius>
</circle>
</data>
circle.xsl
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:myObj="urn:myObj">
<xsl:template match="data">
<circles>
<xsl:for-each select="circle">
<circle>
<xsl:copy-of select="node()"/>
<circumference>
<xsl:value-of select="myObj:Circumference(radius)"/>
</circumference>
</circle>
</xsl:for-each>
</circles>
</xsl:template>
</xsl:stylesheet>
Resultados
<circles xmlns:myObj="urn:myObj">
<circle>
<radius>12</radius>
<circumference>75.398223686155</circumference>
</circle>
<circle>
<radius>37.5</radius>
<circumference>235.61944901923448</circumference>
</circle>
</circles>