Para ver el artículo en inglés, active la casilla Inglés. También puede ver el texto en inglés en una ventana emergente si pasa el puntero del mouse por el texto.
Traducción
Inglés

XsltArgumentList para parámetros Stylesheet y objetos de extensión

 

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.

System_CAPS_noteNota

Las clases XslTransform y XsltArgumentList son obsoletas en .NET Framework 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.

Los parámetros XSLT se agregan 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

String

System.String

XPath

Boolean

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:

  1. Crear XsltArgumentList y añadir los objetos mediante AddParam.

  2. Llamar a los parámetros desde la hoja de estilos.

  3. Pasar XsltArgumentList al método Transform.

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.

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();
  }
}

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>

<order>
   <total>36.9</total> 
   15% discount if paid by: 5/6/2001 5:01:15 PM 
</order>

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:

  1. Crear XsltArgumentList y añadir el objeto de extensión mediante AddExtensionObject.

  2. Invocar al objeto de extensión desde la hoja de estilos.

  3. Pasar XsltArgumentList al método Transform.

En el ejemplo siguiente se calcula la longitud de una circunferencia 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 = "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;
    }
  }
}

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>

<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>

Mostrar: