Você está offline; aguardando reconexão

COMO: Utilizar objetos de extensão ao executar transformações de XSL em aplicativos do Visual Basic .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: 321702
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 .NET Visual Basic chamado InventoryExtensionObject de projeto de biblioteca.
  2. Exclua o módulo de Class1.vb padrão que é adicionado para o projeto.
  3. Adicione um novo módulo de classe denominado Products.vb 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.vb para implementar a classe de produtos :

    Observação <username>Você deve alterar a ID de usuário <nomedousuário> valor e a senha = < senha de alta segurança > valor para os valores corretos antes de executar esse código. Certifique-se que a ID de usuário tenha as permissões apropriadas para executar esta operação no banco de dados.
    Imports System.Data.SqlClientPublic Class Products    Private cn As SqlConnection    Public Function GetCurrentStockLevel(ByVal ProductId As Integer) As Integer        'Construct query to retrieve UnitsInStock for the specified ProductId.        Dim cmd As New SqlCommand("Select UnitsInStock from Products where ProductID = " & ProductId, cn)        Dim UnitsInStock As Integer        'Execute query to retrieve UnitsInStock.        UnitsInStock = CType(cmd.ExecuteScalar(), Integer)        Return UnitsInStock    End Function    Public Sub New()	'You will need to modify the connection string in the following         'statement to point to your instance of the Northwind SQL Server  	'sample database.        cn = New SqlConnection("server=.;database=northwind;user id=<username>;password=<strong password>;")        cn.Open()    End Sub    Public Sub Dispose()        cn.Close()    End SubEnd Class					
  5. Salvar as alterações para Products.vb 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, crie uma nova Web .NET Visual Basic chamado SupplierSample de projeto de aplicativo.
  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 as seguintes instruções Imports na parte superior da do módulo de classe antes da classe de declaração:
    Imports System.XmlImports System.Xml.XPathImports 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.             Dim xmldoc As New XPathDocument(Request.InputStream)            'Instantiate a new XslTransform object and load the style sheet.             Dim xslt As 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.	                Dim xsltArgList As New System.Xml.Xsl.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.            Dim InventoryExtensionObj As 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 = Nothing            'Exception handling code.        Catch xsltExp As System.Xml.Xsl.XsltException            Response.Write(xsltExp.Message)        Catch xsltCompileExp As System.Xml.Xsl.XsltCompileException            Response.Write(xsltCompileExp.Message)        Catch XPathExp As System.Xml.XPath.XPathException            Response.Write(XPathExp.Message)        Catch XmlExp As XmlException            Response.Write(XmlExp.Message)End Try					
  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, crie uma nova Web .NET Visual Basic Application 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="vb" AutoEventWireup="false" Codebehind="GetSupplierStockLevels.aspx.vb" 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 Basic 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. Adicionar as seguintes instruções Imports antes da declaração de classe GetSupplierStockLevels :
    Imports System.NetImports System.IO					
  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 occurred. If yes, then execute code        'to generate the XML and post it to the Supplier application.        If Page.IsPostBack Then            '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.            Dim strXML As 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 = True Then                strXML.Append("<Product id='1' name='" & Product1.Text & "'/>")            End If            If Product2.Checked = True Then                strXML.Append("<Product id='2' name='" & Product2.Text & "'/>")            End If            If Product3.Checked = True Then                strXML.Append("<Product id='3' name='" & Product3.Text & "'/>")            End If            '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. 			    Dim PostURL as String = "http://localhost/SupplierSample/GetProductStockLevels.aspx"            Dim HttpWReq As HttpWebRequest = CType(WebRequest.Create(PostURL), HttpWebRequest)            'Intantiate a Stream object. The generated XML will be written to this object.            Dim HttpStream As Stream            '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.            Dim buf As 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.            Dim HttpWResp As HttpWebResponse = CType(HttpWReq.GetResponse(), HttpWebResponse)            'Use the GetResponseStream method of the HttpWebResponse object             'to obtain a reference to its response stream.            Dim receiveStream As Stream = HttpWResp.GetResponseStream()            'Use the GetEncoding Static method of the System.Text.Encoding object to             'instantiate a UTF-8 Encoding object.             Dim encode As System.Text.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.            Dim readStream As New StreamReader(receiveStream, encode)            '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.             Dim read(256) As Char            Dim count As Integer = readStream.Read(read, 0, 256)            Console.WriteLine("HTML..." + ControlChars.Lf + ControlChars.Cr)            While count > 0                'Write the 256 characters to a string.                 Dim str As New String(read, 0, count)                Response.Write(str)                count = readStream.Read(read, 0, 256)            End While            'Close the StreamReader.            readStream.Close()            'Close the HttpWebResponse object.             HttpWResp.Close()            Response.End()        End If  					
  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: 321702 - Última Revisão: 01/23/2004 19:10:20 - Revisão: 4.0

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

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