Você está offline; aguardando reconexão

COMO: Utilizar objetos de extensão ao executar transformações de XSL em aplicativos do Visual translation from VPE for Csharp .NET

IMPORTANTE: Este artigo foi traduzido por um sistema de tradução automática (também designado por Machine Translation ou MT), não tendo sido portanto traduzido ou revisto por pessoas. A Microsoft possui artigos traduzidos por aplicações (MT) e artigos traduzidos por tradutores profissionais, com o objetivo de oferecer em português a totalidade dos artigos existentes na base de dados de suporte. No entanto, a tradução automática não é sempre perfeita, podendo conter erros de vocabulário, sintaxe ou gramática. A Microsoft não é responsável por incoerências, erros ou prejuízos ocorridos em decorrência da utilização dos artigos MT por parte dos nossos clientes. A Microsoft realiza atualizações freqüentes ao software de tradução automática (MT). Obrigado.

Clique aqui para ver a versão em Inglês deste artigo: 323370
Aviso de Isenção de Responsabilidade sobre Conteúdo do KB Aposentado
Este artigo trata de produtos para os quais a Microsoft não mais oferece suporte. Por esta razão, este artigo é oferecido "como está" e não será mais atualizado.
Sumário
Blocos de script de linha e componentes de código externo podem ser usados para implementar rotinas personalizadas que são chamadas durante o curso de um XSL transformação (XSLT) para executar cálculos e processar dados. A Microsoft recomenda que você evitar o uso de blocos de script de linha e usar código externo componentes para implementar essas rotinas personalizadas quando você cria XSLT portátil folhas de estilo. Componentes de código externo que são usados por uma XSLT são chamados de objetos de extensão do XSLT.

Este artigo passo a passo descreve como configurar e testar exemplo ASP.NET aplicativos com base em um cenário possível reais para demonstrar como usar objetos de extensão enquanto você executa a XSLT no Microsoft .NET aplicativos.

back to the top

Visão geral sobre o cenário de exemplo

Esta seção fornece uma descrição do cenário que conduz o design dos componentes de aplicativo de exemplo que você irá criar.

ABC Corporation é um fornecedor que stocks e vende suprimentos de alimentos que são fabricados por fornecedores de selecionados algumas. ABC corp. usa uma intranet ASP.NET fornecedor externo e aplicativo para registrar e controlar informações que se refere ao seu inventário, pedidos de clientes, ordens de compra. Uma limitação nos atuais estoque gerenciamento compra ordem módulos e é a falta de um recurso para exibir os níveis de estoque atuais para um produto em um site do fornecedor dinamicamente antes de colocar uma ordem de compra. A equipe de tecnologia de informações no ABC corp. tenha informado o gerenciamento que esse recurso pode ser implementado se os sistemas de informações que são usados por fornecedores tenham provisões dinamicamente os dados necessários do exchange. A equipe de gerenciamento no ABC corp. abordou essa funcionalidade com cada um dos fornecedores e encontrado que nenhum dos fornecedores tinha a provisão para lidar com esse requisito.

Um dos fornecedores, XYZ Corporation, expresso interesse em conquistar essa opção porque ele sentiam que um recurso também pode se beneficiar outros revendedores XYZ Corporation faz negócios com. Os sistemas de informações no XYZ Corporation também são criados no .NET Framework usando tecnologias .NET. As equipes de gerenciamento de ambas as organizações decidiram permitir que sua equipe de tecnologia informações atender e debater a arquitetura de implementação para esse recurso. A seguir está uma listagem de alto nível dos componentes do modelo de implementação de combinado ao final:
  • O varejista (ABC corp.) deseja exibir os níveis de estoque atuais para produtos selecionados no site do fornecedor (XYZ Corporation) formatados e exibidos como uma tabela HTML.
  • O varejista irá usar XML para enviar a lista de identificações de produto para que níveis de estoque atuais são necessárias do fornecedor. O XML será ser construído com base em produtos que foram selecionados de uma lista que é exibida em um formulário do ASP.NET. O XML gerado terá o mesmo formato como o exemplo a seguir:
    <?xml version="1.0"?><Products>	<Product id="1" name="Chai"/>	<Product id="2" name="Chang"/>	</Products>					
  • O fornecedor usará uma folha de estilo XSLT para transformar o XML recebido e gerar o HTML. A folha de estilos XSLT irá usar o objeto XSLT extensão dinamicamente consultar o banco de dados de inventário de fornecedor e incluir dados sobre os níveis de estoque de produto no HTML gerado.
O restante deste artigo descreve como implementar os componentes que estão descritos neste modelo. Para manter as coisas simples, você irá criar e teste todos os componentes em um único computador.

back to the top

Criar o objeto de extensão de exemplo

Nesta seção você criar o objeto de extensão que o fornecedor (XYZ Corporation) usa dinamicamente no cenário de exemplo para recuperar informações de estoque de produto. Para fins de ilustração, este exemplo usa os dados contidos na tabela Produtos no banco de dados SQL Server Northwind. O objeto de extensão implementa um único método chamado GetCurrentStockLevel . O método tem uma identificação do produto como seu parâmetro de entrada e retorna as unidades atuais em estoque para o produto especificado com base nos dados na tabela Produtos.

Este objeto de extensão e o método são invocados pela folha de estilo XSLT que é usada para transformar o XML que é lançado pelo revendedor (ABC corp.) para recuperar informações estoque atuais para os produtos solicitados.

Para criar este componente:
  1. No Visual Studio. NET, crie uma nova classe de .NET translation from VPE for Csharp Visual projeto de biblioteca chamado InventoryExtensionObject.
  2. Exclua o módulo de Class1.cs padrão que é adicionado para o projeto.
  3. Adicione um novo módulo de classe denominado Products.cs para o projeto. Abra isso no editor de código e, em seguida, exclua o código existente.
  4. Cole o seguinte código no módulo de classe Products.cs para implementar a classe de produtos :
    using System;using System.Data.SqlClient;namespace InventoryExtensionObject{   public class Products   {      SqlConnection cn;      public Products()      {         //You must modify the connection string in the following          //statement to point to your instance of the Northwind SQL Server         //sample database. Make sure to use a user id that has the appropriate        //permissions on the database.         cn = new SqlConnection("server=.;database=northwind;user id=<username>;password=<strong password>;");         cn.Open();      }      public int GetCurrentStockLevel(int ProductId)      {         //Construct query to retrieve UnitsInStock for the specified ProductId.         SqlCommand cmd = new SqlCommand("Select UnitsInStock from Products where" +                                           " ProductID = " + ProductId, cn);         //Execute query to retrieve UnitsInStock.         int UnitsInStock = Convert.ToInt32(cmd.ExecuteScalar());                  return UnitsInStock;      }            public void Dispose()      {         cn.Close();      }   }}					
  5. Salvar as alterações para Products.cs e, em seguida, criar a solução.
back to the top

Criar a folha de estilos XSLT que usa o objeto de extensão

Nesta seção você criar a folha de estilos XSLT que o fornecedor (XYZ Corporation) usa o cenário de exemplo para gerar a tabela HTML que exibe informações sobre o nível de estoque atual para produtos que solicita o varejista (ABC Corporation). Esta folha de estilos é usada para transformar o XML que é lançado pelo revendedor que contém a lista de identificações de produto para o qual as informações de estoque atuais são necessárias. Ele usa o objeto de extensão que você criou na seção anterior para recuperar dados que pertencem às unidades em estoque para cada produto atuais.

Use o código a seguir para criar e salvar uma folha de estilo XSLT chamada Products.xsl ao seu disco rígido:
<?xml version='1.0'?><!-- Notice how a namespace URI and prefix are declared to reference the extension object --> <xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0"                  xmlns:InventoryExtensionObj="urn:InventoryExtensionObj"><xsl:template match="Products">	<HTML>		<BODY>	<H3>XYZ Corp. Inventory stock level</H3><BR/>	<TABLE BORDER="1">		<TR>			<TH>Product Id</TH>			<TH>Product Name</TH>			<TH>Units In Stock</TH>		</TR>			<xsl:for-each select="Product">		<TR>     			 <TD><xsl:value-of select="@id"/></TD>			 <TD><xsl:value-of select="@name"/></TD>			 <!-- 			      Call extension object method to retrieve stock information.			      Notice how the id attribute of the Product element is passed as the input			      parameter. The actual instance of the Extension object will be supplied			      by the code that executes the XSLT transformation.  			 -->   			 <TD><xsl:value-of select="InventoryExtensionObj:GetCurrentStockLevel(@id)"/></TD> 		</TR>	</xsl:for-each>	</TABLE>	</BODY>	</HTML>		</xsl:template> </xsl:stylesheet> 				
back to the top

Criar os aplicativos ASP.NET de exemplo para testar a transformação do XSLT

Nesta seção você irá criar amostras de dois aplicativos do ASP.NET. Um aplicativo ASP.NET é usado para hospedar um ASP.NET formulário que o varejista (ABC corp.) usa o cenário de exemplo para selecionar os produtos para os quais ações informações atualizadas sobre é necessário. Esse formulário da Web contém código em seu módulo de classe code-behind para gerar e lançar o XML que contém a lista de produtos selecionados a um componente no site do fornecedor (XYZ Corporation) e para exibir a resposta HTML retornada.

O outro aplicativo ASP.NET é usado para implementar um formulário da Web no sistema do fornecedor que o XML que gera o varejista é lançado. O módulo de classe code-behind desse formulário da Web contém código para carregar o XML que é lançado para ele e executa a XSLT transformação usando a folha de estilos XSLT que você criou na etapa anterior para gerar e retornar o HTML necessário. Ele também contém o código para criar e fornecer uma instância do objeto de extensão para o processo de transformação do XSLT. Primeiro você criar o aplicativo ASP.NET para o fornecedor.

back to the top

Aplicativos ASP.NET de fornecedor para executar a transformação do XSLT

  1. No Visual Studio. NET, criar uma nova Web de .NET translation from VPE for Csharp Visual projeto de aplicativo chamado SupplierSample.
  2. Exclua o formulário de Web padrão (WebForm1.aspx) que é adicionado ao projeto.
  3. Adicione folha de estilo XSLT (Products.xsl) que você criou na etapa anterior para o projeto da Web.
  4. Adicione uma referência de projeto para o objeto de extensão DLL (InventoryExtensionObject.dll) que você criou na seção "Criar o objeto de extensão de exemplo" deste artigo.
  5. Adicionar um novo formulário da Web denominado GetProductStockLevels.aspx para o projeto e exibir seu código.
  6. Adicione o seguinte ao final da seção de diretivas usando :
    using System.Xml;using System.Xml.XPath;using System.Xml.Xsl;					
  7. Cole o seguinte código no procedimento de evento Page_Load para executar a transformação XSLT em XML que é enviado para o formulário da Web. Estudar os comentários in-line para ver como o objeto de extensão é instanciado e usado pelo processo de transformação:
    try{	// Instantiate a new XPathDocument object and load the posted XML.	XPathDocument xmlDoc = new XPathDocument(Request.InputStream);		// Instantiate a new XslTransform object and load the style sheet. 	XslTransform xslt = new XslTransform();	xslt.Load(Server.MapPath("products.xsl"));	// Instantiate an XsltArgumentList object.	// An XsltArgumentList object is used to supply extension object instances	// and values for XSLT paarmeters required for an XSLT. transformation	    	XsltArgumentList xsltArgList = new XsltArgumentList();	//Instantiate and Add an instance of the extension object to the XsltArgumentList.	//The AddExtensionObject method is used to add the Extension object instance to the	//XsltArgumentList object. The namespace URI specified as the first parameter 	//should match the namespace URI used to reference the Extension object in the	//XSLT style sheet.	InventoryExtensionObject.Products InventoryExtensionObj = new InventoryExtensionObject.Products();	xsltArgList.AddExtensionObject("urn:InventoryExtensionObj", InventoryExtensionObj);			// Set the ContentType of the ASP.NET Response object to text/html.	Response.ContentType = "text/html";		// Execute the transformation and generate the output to the Response object's	// output stream. Notice how the XsltArgumentList object to which the Extension	// object instance was added is supplied as a parameter when executing the	// Transform method of the XslTransform object. 	xslt.Transform(xmlDoc, xsltArgList, Response.OutputStream);	InventoryExtensionObj.Dispose();	InventoryExtensionObj = null;}// Exception handling code.catch(XsltCompileException xsltCompileExp){	Response.Write(xsltCompileExp.Message);}catch(XsltException xsltExp) {	Response.Write(xsltExp.Message);}catch(XPathException XPathExp){	Response.Write(XPathExp.Message);}catch(XmlException XmlExp){	Response.Write(XmlExp.Message);}					
  8. Salvar, compilar e criar a solução de projeto da Web.
back to the top

Revendedor ASP.NET Application to níveis de ações do fornecedor de consulta

  1. No Visual Studio. NET, criar uma nova Web de .NET translation from VPE for Csharp Visual aplicativo chamado RetailerSample.
  2. Exclua o formulário de Web padrão (WebForm1.aspx) que é adicionado ao projeto.
  3. Adicione um novo formulário da Web chamado GetSupplierStockLevels.aspx para o projeto.
  4. Alterne para o painel HTML de formulário da Web na janela de designer e substitua o código existente com o seguinte para gerar uma interface de usuário de teste simples: A interface do usuário exibe três caixas de seleção que representam três produtos que são fornecidos pelo fornecedor (e para os dados que existem no banco de dados de exemplo Northwind) no cenário de exemplo. As caixas de seleção são difíceis de codificado neste exemplo para manter a simplicidade. Eles podem ser gerados dinamicamente usando ligação de dados e o controle de servidor ASP.NET CheckBoxList em um aplicativo de mundo real.
    <%@ Page Language="cs" AutoEventWireup="false" Codebehind="GetSupplierStockLevels.aspx.cs" Inherits="RetailerSample.GetSupplierStockLevels"%><!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN"><HTML>	<HEAD>		<title>TestPost</title>		<meta content="Microsoft Visual Studio.NET 7.0" name="GENERATOR">		<meta content="Visual C# 7.0" name="CODE_LANGUAGE">		<meta content="JavaScript" name="vs_defaultClientScript">		<meta content="http://schemas.microsoft.com/intellisense/ie5" name="vs_targetSchema">	</HEAD>	<body MS_POSITIONING="GridLayout">		<form id="Form1" method="post" runat="server">			<asp:Label id="Label1" style="Z-INDEX: 101; LEFT: 39px;                                   POSITION: absolute; TOP: 87px" runat="server"                                    Width="575px" Height="43px" Font-Names="Arial"                                    Font-Size="Medium">Get Stock Levels from XYZ Corp. for selected Products    			</asp:Label>			<asp:CheckBox id="Product3" style="Z-INDEX: 104; LEFT: 359px;                                       POSITION: absolute; TOP: 154px" runat="server" Width="170px"                                       Height="30px" Font-Names="Arial" Font-Size="X-Small" Text="Aniseed syrup">                         </asp:CheckBox>			<asp:CheckBox id="Product1" style="Z-INDEX: 102; LEFT: 39px;                                       POSITION: absolute; TOP: 155px" runat="server" Width="122px" 				      Height="35px" Font-Names="Arial" Font-Size="X-Small" Text="Chai">			</asp:CheckBox>			<asp:CheckBox id="Product2" style="Z-INDEX: 103; LEFT: 175px; 					POSITION: absolute; TOP: 155px" runat="server" Width="170px" 					Height="30px" Font-Names="Arial" Font-Size="X-Small" Text="Chang">			</asp:CheckBox>			<asp:Button id="Button1" style="Z-INDEX: 105; LEFT: 40px; 					POSITION: absolute; TOP: 237px" runat="server" Width="134px" 					Height="33px" Text="Go">			</asp:Button>			<asp:Label id="Label2" style="Z-INDEX: 106; LEFT: 36px; 					POSITION: absolute; TOP: 21px" runat="server" Width="579px" 					Height="37px" Font-Names="Arial" Font-Size="Medium" 					ForeColor="#0000C0">ABC Corp : Verify product stock levels with Partner company			</asp:Label></form>	</body></HTML>					
  5. Abra o módulo de classe code-behind de formulário da Web no editor de código de Visual Studio. NET.
  6. Adicione o seguinte ao final da seção de diretivas usando :
    using System.Net;using System.IO;using System.Text;					
  7. Cole o seguinte código no procedimento de evento Page_Load : este código gera o XML listando os produtos selecionados, envia o XML para o aplicativo de fornecedor e exibe o HTML retornado para gerar a tabela que lista os níveis de estoque atuais do fornecedor. Ele usa as classes HttpWebRequest e HttpWebResponse no namespace System.NET para enviar o XML para o site do fornecedor e acessar a resposta retornada. Para obter mais informações sobre os métodos desses objetos usados nesse código, consulte a documentação do .NET Framework SDK sobre essas classes.
    //Check to see if a post back occured. If yes, then execute  code//to generate the XML and post it to the Supplier application.if(Page.IsPostBack){	//Use a StringBuilder object to generate the XML string to post to the	//Supplier application. Strings in .NET are non-mutable. Using a String 	//variable to generate the following XML string would result in multiple	//String objects being created behind the scenes each time the variable is 	//modified. This can be prevented by using a StringBuilder object.	StringBuilder strXML = new System.Text.StringBuilder();	//Append a string for the root <Products> node. 	strXML.Append("<Products>");	//Generate a <Product> node for each selected product. To do this	//examine the Checked property of each product check box on the web form. 	if(Product1.Checked)		strXML.Append("<Product id='1' name='" + Product1.Text + "'/>");	if(Product2.Checked)		strXML.Append("<Product id='2' name='" + Product2.Text + "'/>");	if(Product3.Checked)		strXML.Append("<Product id='3' name='" + Product3.Text + "'/>");	//Append the closing </Products> node.	strXML.Append("</Products>");	//Instantiate a System.Net.HttpWebRequest object to post the generated XML to the 	//the GetProductStockLevels.aspx web form in the Supplier application. 	string PostURL = "http://localhost/SupplierSample/GetProductStockLevels.aspx";	HttpWebRequest HttpWReq = (HttpWebRequest) WebRequest.Create(PostURL);	//Intantiate a Stream object. The generated XML will be written to this object.	Stream HttpStream;	//Instantiate a Byte Array and use the GetBytes Static method of 	//of the System.Text.Encoding.UTF8 class to write the UTF-8 encoded	//byte representation of the generated XML string to the Byte Array.	Byte[] buf = System.Text.Encoding.UTF8.GetBytes(strXML.ToString());	//Set the Method property of the HttpWebRequest to POST to indicate	//that it will be used to execute an HTTP POST request. 	HttpWReq.Method = "POST";	//Write the contents of the Byte Array (the UTF-8 encoded byte representation	//of the XML string) to the HttpWebRequest's RequestStream. This is the data that 	//will be posted to the target URL. The GetRequestStream method is used to obtain 	//a reference to the HttpWebRequest's request stream. 	HttpStream = HttpWReq.GetRequestStream();	HttpStream.Write(buf, 0, buf.Length);	HttpStream.Close();	//Execute the GetResponse method of the HttpWebRequest object to execute the POST	//and use the generated Response to instantiate an HttpWebResponse object.	HttpWebResponse HttpWResp = (HttpWebResponse) HttpWReq.GetResponse();	//Use the GetResponseStream method of the HttpWebResponse object 	//to obtain a reference to its response stream.	Stream receiveStream = HttpWResp.GetResponseStream();	//Use the GetEncoding Static method of the System.Text.Encoding object to 	//instantiate a UTF-8 Encoding object. 	Encoding UTF8_Encoding = System.Text.Encoding.GetEncoding("utf-8");	// Pipe the response stream to a higher level stream reader with the required 	//encoding format. The StreamReader object will be used to access the contents	//of the ResponseStream.	StreamReader readStream = new StreamReader(receiveStream, UTF8_Encoding);	//Loop through and write out the contents of the ResponseStream (contains	//the HTML generated and returned by the Supplier application) 256 characters	//at a time to the ASP.NET Response object to display the HTML table listing 	//the Products and their current stock levels at the Supplier site. 	char[] read = new char[256];	int count = readStream.Read(read, 0, 256);	Console.WriteLine("HTML...\n\r");	while (count > 0)	{		//Write the 256 characters to a string.		String str = new String(read, 0, count);		Response.Write(str);		count = readStream.Read(read, 0, 256);	}	//Close the StreamReader.	readStream.Close();	//Close the HttpWebResponse object. 	HttpWResp.Close();	Response.End();}					
  8. Salvar, compilar e criar a solução de projeto da Web.
back to the top

Teste os aplicativos ASP.NET de exemplo

  1. Use a seguinte URL para localizar o formulário da GetSupplierStockLevels.aspx Web no aplicativo revendedor:
    http://localhost/RetailerSample/GetSupplierStockLevels.aspx					
  2. Usar as caixas de seleção no formulário da Web para selecionar os produtos para o qual você deseja obter informações de estoque atuais do fornecedor aplicativo.
  3. Clique no botão Ir para gerar o XML para refletir os produtos selecionados, lançar o XML para o formulário da GetProductStockLevels.aspx Web no aplicativo Supplier e exibir o HTML retornado. Você verá uma tabela HTML que relaciona os produtos selecionados juntamente com seus níveis de estoque atuais no fornecedor site.
back to the top

Para mais informações

Implementação e acessar objetos de extensão em folhas de estilos XSLT são a metodologia de design recomendado quando você deve chamar as rotinas personalizadas em uma transformação XSL. XSLT objetos de extensão não exigem blocos de script embutido na folha de estilos XSLT. Blocos de script embutido podem tornar a folha de estilos dependentes específicas de fornecedor marcas de script de extensão XSLT script ou programação interpretadores de idioma e compiladores. Objetos de extensão XSLT, por outro lado, não especifique ou definir os detalhes de implementação relacionados a tecnologias e componentes que são usados para empacotar as rotinas personalizadas. Tudo o que é necessário na folha de estilos XSLT é um URI de espaço para nome e o prefixo que estão associados ao objeto de extensão . O prefixo definido é usado para qualificar chamadas feitas para os métodos do objeto de extensão na folha de estilos XSLT. Você pode usar a tecnologia de sua escolha para implementar o componente de objeto de extensão real. O único requisito é que o processador XML ou XSLT que é usado para executar a transformação deve implementar uma interface que permite que você fornecer instâncias de objetos de extensão como argumentos de entrada para um processo de transformação do XSLT.

Usar objetos de extensão para implementar rotinas personalizadas também é uma solução recomendada para o problema descrito no seguinte artigo da Base de dados de Conhecimento Microsoft:
316775PROBLEMA: Não é possível descarregar assemblies que você criar e carregar usando o script em XSLT
back to the top
Referências
Para obter informações adicionais sobre como executar XSLT usando o .NET Framework, clique no número abaixo para ler o artigo na Base de dados de Conhecimento da Microsoft:
313997INFO: Guia para executar transformações XSLT em aplicativos .NET-conectado
back to the top

Aviso: este artigo foi traduzido automaticamente

Propriedades

ID do Artigo: 323370 - Última Revisão: 01/23/2004 19:02:11 - Revisão: 4.0

Bibliotecas de Classes do Microsoft .NET Framework 1.0, Bibliotecas de Classes do Microsoft .NET Framework 1.1

  • kbmt kbhowtomaster KB323370 KbMtpt
Comentários
d"; document.getElementsByTagName("head")[0].appendChild(m);