O que é WMS?

O WMS, warehouse management system ou sistema de gestão de armazém. É o sistema que faz toda a gestão do CD, de todos os recursos, dos produtos etc.

Suas principais funcionalidades de operação são:

  1. Recebimento – Esse é o processo de receber produtos de parceiros/fornecedores, quando integrado ao ERP (saiba mais de ERP aqui), o recebimento pode (deveria) estar ligado à uma compra com nota fiscal.
  2. Conferência – Isso é basicamente o batimento dos itens que você combinou de receber contra o que de fato foi recebido. Esse batimento é feito geralmente com base em uma nota fiscal ou em um pedido de compra. Quando o valor não bate é necessário efetuar uma operação fiscal para correção dessa quantidade, seja uma nota fiscal de devolução quando a quantidade é menor, ou uma nota fiscal de venda para alocar os itens a mais no estoque, ou ainda em alguns casos extremos as mercadorias são todas levadas de volta…
  3. Armazenar – Aqui colocamos todos produtos no devido endereço e o WMS com sua base de dados o faz da melhor forma possível, de forma a melhorar a roteirização feita no armazém pelos que nele operam.
  4. Separação – Da mesma forma como é tratado no artigo Separação de produtos
  5. Expedição – Aqui o WMS gerencia o endereçamento dos produtos para as docas, onde os transportadores aguardam para levar os produtos ao seu destino.
  6. Inventário – É o processo de conferência do estoque, e ele pode ser feito em todo o armazém o que faz com que toda a operação do armazém fique por conta disso, ou pode ser parcialmente, onde uma parte do time da operação faz a validação enquanto outra parte do time fica focada no inventário, isso é importante para operações que não podem parar totalmente, além disso é bom para manter o time operando quando a ociosidade na operação. Seja cíclico ou total o inventário feito periodicamente permite a você identificar rapidamente rupturas e de forma pró-ativa sem afetar suas vendas.
  7. Endereçamento – Você poderá criar espaços delimitados fisicamente no seu armazém (andar, corredor, baia, nível e slot), além criar espaços virtuais, como por exemplo, você poder te um pallet ou box em um lugar determinado no armazém e determinar que todos os itens pequenos com avaria devam ser depositados ali.

Espero que esse artigo tenha contribuído no seu conhecimento.

Abs e até mais.

O que é ERP?

Muitas vezes chegamos em um projeto e temos que integrar com o ERP, receber dados de catálogo de produto do ERP, mandar pedidos para o ERP e fazer tudo quanto é comunicação com o tal do ERP! Mas, na prática o que é ERP? 

ERP é uma sigla oriunda do nome Enterprise Resource Planning que, traduzido ao pé da letra, significa “Planejamento dos recursos da empresa”. ERPs são que softwares que integram todos os dados e processos de uma organização em um único sistema.

Esses ERP’s são grandes sistemas compostos por vários módulos que tem por finalidade suportar a gestão e controlar áreas da empresas, tais como contabilidade, financeiro, fiscal, recursos humanos, logística etc., e mais do que isso como os dados estão na mesma base de dados isso dá condição ao ERP de ter os módulos integrados e de fato manter a empresa toda interligada de forma sistêmica. 

Uma grande vantagem de ter um ERP é justamente a possibilidade de diminuir softwares satélites na Operacao tecnológica. Também há ERP’s específicos para determinadas indústrias/ramos como varejo, moda, escolas, manufaturas farmacêuticas etc. 

Espero que esse artigo tenha agregado valor e conhecimento.  

Abs e até a próxima. 

Recorrência de Pagamento no e-Commerce com cartão de crédito (e um pouco de PCI)

Quantos de vocês têm curiosidade de saber como é que o Spotify, Apple, Netflix dentro outros mensalmente cobram seus clientes no cartão de crédito ou de débito e pedindo esse cartão apenas uma vez? Pois bem, aqui vou colocar algumas abordagens que permitem que essa operação seja feita e de forma segura (tanto para o prestador de serviço quanto para o cliente).

É necessário guardarmos dados do cliente dentro da plataforma e efetuando a cobrança de forma automática, é aqui que temos que levar em consideração detalhes de infraestrutura e desenvolvimento do sistema.

 

Desenvolvimento de software/produto segundo padrão PCI DSS

Há 12 regras/requerimentos que devem ser seguidos quando uma solução precisa seguir os requerimentos do PCI DSS, são elas:

  1. Instalar e manter um firewall para proteger dados de cartão de crédito.
  2. Não utilizar senhas padrão ou outras configurações de segurança dos softwares utilizados.
  3. Proteger dados de cartões de crédito armazenados.
  4. Utilizar criptografia na transmissão de dados de cartões de crédito, manter um programa de Gerenciamento de Vulnerabilidades.
  5. Utilizar regularmente programas anti-vírus.
  6. Desenvolver e manter sistemas e aplicações seguras, implementar um forte controle de acesso.
  7. Restringir acesso a dados de cartões de crédito por negócio e por pessoas que realmente precisam acessá-los.
  8. Designar um único ID para cada usuário da rede e sistemas.
  9. Restringir acesso físico aos dados de cartão de crédito, testar e monitorar a rede regularmente.
  10. Rastrear e monitorar todos os acessos à rede e dados de cartões de crédito.
  11. Testar a segurança de sistemas e processos regularmente, manter um programa de Gerenciamento de Vulnerabilidades.
  12. Manter uma política que enderece informações de segurança.

Não se engane pensando que esses requerimentos são aplicados somente ao software da solução, pois quando você lê o Guia Rápido do PCI DSS fica claro que o hardware também deve ser específico para suportar a operação.

 

Terceirizando a solução

Uma proposição para solução é gravar os dados do cartão dentro de um gateway de pagamento (que por sua vez já deve seguir todas as regas do PCI, portanto o prestador do serviço também já garantiria isso).

Aqui há uma proposição de arquitetura de infraestrutura que a AWS deixou disponível em seu site através do link PCI DSS Compliance on AWS, que está logo abaixo:

pci-on-aws-architecture.png

Talvez seja uma solução muito robusta e complexa para ser mantida por vendedor de serviços ou um varejista.

 

Utilize um gateway de pagamento

Aqui a solução fica bem mais fácil, basicamente vamos guardar os dados dos cartões dos nossos clientes dentro do gateway de pgamento, exatamente da mesma forma como fazemos quando utilizamos a solução de one-click-buy, gravamos um token dentro de nossa plataforma de eCommerce  e apenas passamos o mesmo para o gateway com a requisição de transação.

Aqui tem uma forma que o PayPal sugere para fazer pagamento recorrente, é bem parecido com o que vemos de integração com gateway de pagamento.

RecurringPaymentsFlowUX

Aqui temos temos uma fluxo simples que demonstra que, após ter o dados do cartão gravados na base de dados (qualquer que seja ela), basta ter um agendamento para fazer a requisição da transação novamente.

flow-recurring-payments

Quem é responsável pelas normas do PCI?

É a PCI Security Standards Council que faz a administração dos padrões de segurança do pagamentos de cartão, padrão também conhecido como PCI DSS. Esse órgão foi fundado por instituições como American Express, Discover Financial Services, JCB International, MasterCard Worldwide e Visa Inc.

Quem deve estar dentro desse padrão PCI DSS?

TODAS as empresas que transacionam, armazenam e processam dados do titulas do cartão (CHD – Card Holder Data/Dados do titular do cartão) ou dados que dependem de autenticação (SAD – Sensitive Authentication Data/Dados de autenticação sensíveis), se encaixam nesse perfil varejistas, comerciantes, processadores, compradores, emissores e provedores de serviços.

Bom, espero que isso esse material tenha agregado conhecimento a vocês. Até a próxima!

Referências

https://aws.amazon.com/pt/compliance/pci-dss-level-1-faqs/

https://www.pcisecuritystandards.org/

https://www.pcisecuritystandards.org/pci_security/glossary

https://www.pcisecuritystandards.org/pdfs/pci_ssc_quick_guide.pdf

https://developer.paypal.com/docs/classic/express-checkout/integration-guide/ECRecurringPayments/

http://paylane.com/recurring-payments/

Geração de onda

Bom pessoal, agora vamos falar de um assunto que muitos passam batido, porém com algum conhecimento do assunto a vida dentro da operação no CD ficará muito melhor.

No começo de toda operação pequena, as ondas são feitas basicamente na ordem de chegada dos pedidos, ou seja, quase que FIFO, mas, conforme a operação cresce, ou em caso de operações que já nascem grandes, é muito importante ter claro a estratégia de geração de ondas para separação.

Você deve se lembrar que quando há Envio das entregas do pedido para a operação CD algumas variáveis são enviadas dentro desse pedido, e a estratégia da separação de produtos começa justamente nesse ponto.

Um dos principais critérios de separação da onda é a transportadora, pois, dessa forma você ganha eficiência para colocar a maior quantidade de pedidos separados em uma doca de um única vez e já faz o envio das entregas para os clientes.

Outro critério muito utilizado é por categoria dos produtos (eletrônicos, eletrodomésticos, instrumentos musicais), pois há forma específica de tratar algumas categoria.

Outra é fazendo a separação por PAR (Produto de Alto Risco), nesse caso todos os produtos dessa área são separados para serem faturados (smartphones, tablets, jóias etc.).

Outra modalidade que vi bastante é gerar onda por pedido mono item (quando há apenas um item na entrega) e multi item (quando há mais de um item na entrega), isso faz sentido quando você pensa na consolidação dos pedidos antes do faturamento.

O tempo limite de entrega também é muito importante para ser considerado, pois, aqui você antecipa as entregas dos clientes que podem estar próximas de sofrer algum atraso.

Agora, há casos nos quais você poder flags especiais para a onda, como por exemplo “Reclame Aqui, “Consumidor.gov”, “Prioridade” etc., de acordo com sua necessidade, mas o que eu mais vi foram essas mesmas. E sempre de acordo com  que faz sentido para a operação.

Por cubagem (dimensões e tamanho do produto), geralmente o pessoal chama de “Leve” e “Pesado”.

Ainda temos mais alguns critérios, e no final do dia acabamos mesclando esses critérios, tudo bem busca da melhor performance da operação para o melhor atendimento do cliente.

Espero que você tenha gostado. Deixe seu comentário!

Abs e até a próxima!

Envio das entregas do pedido para a operação CD

Aqui começa uma parte muito interessante da operação, diria eu que essencial, entretanto pouco conhecida.

Nesse momento o pedido é enviado para a operação no CD, isso significa, que o pedido com todas os detalhes e características relacionados à logística são enviados para o ERP e para o WMS (que, por sua vez integram com a SEFAZ e com o TMS, veremos isso em outro post logo menos).

Agora a grande questão é “o que são detalhes e características relacionados à logística”? Basicamente os dados abaixo:

  1. Tipo de entrega: agendada, expressa, econômica, normal etc;
  2. Data limite de entrega (combinada): tempo de manuseio do item dentro do CD + tempo da transportadora para entregar o produto, geralmente após o pagamento;
  3. Armazém de origem das mercadorias
  4. Flag para especialização do pedido: priorizado, black friday, reenvio etc;
  5. Transportadora: Há plataformas de loja e de backoffice/OMS que tem essa funcionalidade fazendo com que nem precise de um TMS para tal operação

Bom, agora você sabe o que significa enviar o pedido para operação CD. E tem mais, quando o pedido chega tanto no WMS ou no ERP (em alguns casos é o mesmo sistema), caso não exista a quantidade de estoque logo haverá uma crítica no sistema que nos permitirá avisar ao cliente que o pedido não pode ser concluído, e por consequência isso nos levará a falar do assunto denominado unhappy flow, mas esse ficará para outra série de artigos :).

Abs e até a próxima.

Máquina de status

A máquina de status do eCommerce, nada mais é do que o funil de vendas do eCommerce com a visão de pós vendas com os possíveis status do pedido.

Aqui eu trago apenas uma visão sugestiva de como tratar o assunto, e entendo que aplicabilidade é possível em quase todas as operações de eCommerce que conhecemos.

Enquanto pensamos no pedido (contendo cliente, entregas, pagamentos etc), nossa visão vai do Store Front até a finalização dos pagamentos, a partir do momento em que focamos nas entregas, temos a visão de operação do CD, Fiscal e Logística, pois é comum termos quebra do pedido em mais de uma entrega, ainda mais quando um pedido multi-itens com itens característicos de courrier e itens característicos de rodoviário (rodo).

Nesse momento não é abordado a visão de tracking para o cliente, esse assunto será abordado no tópico tracking, nesse mesmo documento.

Abaixo há uma tabela contendo a visão de máquina de status do pedido / entrega por integração e também por operação dentro de cada produto do ecossistema. Minha intenção é dar uma ideia de como relacionar status do pedido e entrega com o resultado das integrações.

Status Integração/Operação Objeto
feito 01 – Pre auth Pedido
enviado ao backoffice 02 – Order Integration Pedido
em análise de fraude 04 – Request Analysis Pedido
analisado 05 – Request Response Analysis Pedido
Pagamento captura 06 –  Capture amount Pedido
Transportadora integrada 07 – Request Carrier Entrega
enviado para operação 08 – Sent Deliveries (parto f order) Entrega
enviado para onda Geração de odna – WMS Entrega
em Seperação Picking/Separação dos itens do pedido – WMS Entrega
em faturamento Pakcing/Empacotamento do pedido Entrega
Faturado 11 – Request Invoice Entrega
pronto para expedição 13 – Invoice’s group integration / Pre Doca – WMS Entrega
Expedido Expedição – WMS Entrega
Em poder da transportadora 14 – Status/Tracking – Operação da transportadora Entrega
em rota 14 – Status/Tracking – Operação da transportadora Entrega
entregue 14 – Status/Tracking – Operação da transportadora Entrega

Por enquanto é isso, até a próxima.

Baixar arquivo da Web com Java

Depois de efetuar download de arquivos com C# resolvi fazer o mesmo com Java, como estou estudando essa tecnologia agora talvez tenha alguma forma melhor de fazer do que a eu utilizei, de qualquer forma está bem fácil de entender. Veja o código abaixo:


import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.net.URL;

public class Arquivo {
 public static void main(String[] args) throws IOException {

URL url = new URL("http://localhost/catalog.xml");
 String destino = "C:\\Temp\\catalog_java.xml";

InputStream is = url.openStream();

FileOutputStream fos = new FileOutputStream(destino);

int bytes = 0;

while ((bytes = is.read()) != -1) {
 fos.write(bytes);
 }

 is.close();

 fos.close();
 }
}

Até o próxima!

Baixar arquivos da Web com C#

Este exemplo mostra como baixar arquivos a partir de qualquer website para o disco local. Uma maneira simples para efetuar o download do arquivo é usar a classe WebClient e seu método DownloadFile. Este método tem dois parâmetros, primeiro é a url do arquivo que você deseja fazer o download e o segundo parâmetro é o caminho para o disco local para o qual deseja salvar o arquivo.

De forma síncrona

O código a seguir mostra como fazer o download de arquivos de forma síncrona. Este método bloqueia a thread principal até que o arquivo é baixado ou ocorrer um erro (neste caso, o WebException é lançada).


using System.Net;

WebClient webClient = new WebClient();
webClient.DownloadFile("http://localhost/arquivo.txt", @"c:\temp\arquivo.txt");

De forma assíncrona

Para baixar um arquivo sem bloquear o segmento principal uso DownloadFileAsync método assíncrono. Você também pode definir manipuladores de eventos para mostrar o progresso e para detectar que o arquivo é baixado. Faça o exemplo abaixo com uma aplicação Windows Forms.


private void btnDownload_Click(object sender, EventArgs e)
{
 WebClient webClient = new WebClient();
 webClient.DownloadFileCompleted += new AsyncCompletedEventHandler(Completo);
 webClient.DownloadProgressChanged += new DownloadProgressChangedEventHandler(ProgressoFeito);
 webClient.DownloadFileAsync(new Uri("http://localhost/arquivo.txt"), @"c:\temp\arquivo.txt");
}

private void ProgressoFeito(object sender, DownloadProgressChangedEventArgs e)
{
 progressBar.Value = e.ProgressPercentage;
}

private void Completo(object sender, AsyncCompletedEventArgs e)
{
 MessageBox.Show("Download efetuado!");
}

Até a próxima.

Encurtador de URL’s

Essa semana, aproveitei para colocar um pequeno projeto para funcionar, arquitetei e montei um Encurtador de URL’s que faz utilização do Dot Net Framework 4, SQL Server 2008, C#, integração com Web Services.

Da forma como foi feito encurtará apenas um pouco mais de 6 milhões de URL’s, mas está muito fácil para alterar o algorítimo para ter 5 caracteres ao invés de 4 na chave da URL.

A idéia é evoluir esse software e se aumentar muito a quantidade de acessos utilizar um banco de dados como o Apache Cassandra.

O Encurtador de URL’s está disponível no link http://devd.im, e o código fonte está em http://sourceforge.net/projects/devdim.

http://devd.im/

Formatar XML com XSL usando Dot Net

Nesse artigo utilizei Visual C# 2010 Express, Framework 4.0 e para o aplicativo teste fiz um console application.

Com o advento de integração, SOA, Web Services, cada dia mais temos que adaptar o conteúdo de nossos dados com agilidade, no meu caso eu atuo em uma empresa na qual temos vários parceiros comerciais que consomem nosso catálogo de produtos, e a forma de integração que temos é com o uso de XML, bom para acelerar o desenvolvimento do XML para cada parceiro, nós criávamos um XML para cada um, só que isso não era feito de forma automática, a codificação de cada XML era feita individualmente, os objetos eram reutilizados, mas ai tivemos problemas com performance, pois a consulta era feita em tempo real, ou seja, os parceiros concorriam com os clientes que navegavam no site, o XML demorava para ser carregado, quando era necessário efetuar algum filtro por categoria, gênero, marca etc, isso era feito na aplicação, ou seja, o catalogo era carregado inteiro e filtrado através de um delegate, quando eram poucos parceiros, poucos clientes, tudo bem, mas 1 ano depois com muito mais acessos o negócio ficou ruim, e é isso que vou mostrar como fazer aqui, como esse problema foi resolvido, os passos foram:

  1. Não acessar mais o banco diretamente, mas sim um XML base;
  2. Efetuar a formatação dos dados baseado em um XSL e não mais fazer isso na codificação;
  3. Colocar os critérios dentro do XSL ao invés de fazer na aplicação ou em query.

O que é um arquivo XSL e para que serve

Segundo a Wikpedia “XSL Transformations, ou XSLT (eXtensible Stylesheet Language for Transformation – linguagem extensível para folhas de estilo de transformações), é uma linguagem de marcação XML usada para criar documentos XSL que, por sua vez, definem a apresentação dos documentos XML nos browsers e outros aplicativos que a suportem.” ou seja, serve para formatar a saída de dados do XML

Fonte: http://pt.wikipedia.org/wiki/XSLT

Agora que estamos alinhados com o cenário vamos começar.

XML Base

Isso é algo muito tranquilo, foi criado um JOB que gera um XML em uma pasta visível pela aplicação com todo catálogo de produtos, para esse estudo vamos usar o exemplo abaixo:

<?xml version="1.0"
encoding="utf-8" ?>
<catalogo>
  <item>
    <Sku>500135</Sku>
<Descricao><![CDATA[Bola de Tênis Wilson Championship ]]></Descricao>
<CodigoCategoria>102</CodigoCategoria>
    <Categoria>RACKET</Categoria>
<CodigoMarca>15</CodigoMarca>
<Marca>WILSON</Marca>
 </item>
 <item>
    <Sku>500139</Sku>
<Descricao><![CDATA[Haltere Ferro Centauro MeioKg]]></Descricao>
<CodigoCategoria>107</CodigoCategoria>
    <Categoria>BODY               </Categoria>
<CodigoMarca>999</CodigoMarca>
<Marca>FORTE</Marca>
  </item>
  <item>
    <Sku>500140</Sku>
<Descricao><![CDATA[Halteres Ferro Centauro 1 Kg]]></Descricao>
<CodigoCategoria>107</CodigoCategoria>
    <Categoria>BODY               </Categoria>
<CodigoMarca>999</CodigoMarca>
<Marca>FORTE</Marca>
  </item>
  <item>
    <Sku>500141</Sku>
<Descricao><![CDATA[Halteres Ferro Centauro 2Kg]]></Descricao>
<CodigoCategoria>107</CodigoCategoria>
    <Categoria>BODY               </Categoria>
<CodSubGrupo>34</CodSubGrupo>
<Marca>FORTE</Marca>
  </item>
  <item>
    <Sku>500142</Sku>
<Descricao><![CDATA[Halteres Ferro Centauro 3kg]]></Descricao>
<CodigoCategoria>107</CodigoCategoria>
    <Categoria>BODY               </Categoria>
<CodigoMarca>999</CodigoMarca>
<Marca>FORTE</Marca>
  </item>
  <item>
    <Sku>500143</Sku>
<Descricao><![CDATA[Halteres Ferro Centauro 4Kg]]></Descricao>
<CodigoCategoria>107</CodigoCategoria>
    <Categoria>BODY
               </Categoria>
<CodigoMarca>999</CodigoMarca>
<Marca>FORTE</Marca>
  </item>
</catalogo>

XSL’s

Bom, o XSL pode ficar ao gosto de cada um, eu vou colocar dois exemplos aqui, o primeiro nos dará a seguinte saída do XML Base:

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method='xml' indent='yes' version='1.0' encoding='UTF-8' standalone='yes' cdata-section-elements='NOME'/>
<xsl:template match="/">
<produtos>
<xsl:for-each select="catalogo/item[CodigoCategoria='102' and CodigoMarca='999']">
<PRODUTO>
<SKU>
<xsl:value-of select="Sku"/>
</SKU>
<NOME>
<xsl:value-of select="Descricao"/>
</NOME>
<CATEGORIA>
<xsl:value-of select="Categoria"/>
</CATEGORIA>
</PRODUTO>
</xsl:for-each>
</produtos>
</xsl:template>
</xsl:stylesheet>

O segundo nos dará a saída abaixo:

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method='xml' indent='yes' version='1.0' encoding='UTF-8' standalone='yes' cdata-section-elements='NOME'/>
<xsl:template match="/">
<produtos>
<xsl:for-each select="catalogo/item[CodigoCategoria='102']">
<ITEM>
<CODIGO>
<xsl:value-of select="Sku"/>
</CODIGO>
<DESCRICAO>
<xsl:value-of select="Descricao"/>
</DESCRICAO>
</ITEM>
</xsl:for-each>
</produtos>
</xsl:template>
</xsl:stylesheet>

Esses arquivos devem ser criados em um local que a aplicação posso lê-los.

Agora vamos entender algumas tag’s do XSL:

Aqui é feita a declaração do XSL, a versão e qual namespace (xmlns) é utilizado, a tag deve ser fechada

<xsl:stylesheet version="1.0" xmlns:xsl="<a href="http://www.w3.org/1999/XSL/Transform">http://www.w3.org/1999/XSL/Transform</a>">

A saída do arquivo é definida aqui, o método/formato (method), a versão do formato (version), a codificação (encoding) e as tags que terão a saída com CDATA (cdata-section-elements).

<xsl:output method='xml' version='1.0' encoding='UTF-8' cdata-section-elements='NOME'/>

Nesse momento o nó raiz é escolhido para trabalhar, a tag deve ser fechada.

<xsl:template match="/">

Tudo o que não estiver usando o prefixo xsl será escrito da mesma forma como estiver no XSL. Vamos ver o loop agora

Aqui é o começo do loop

<xsl:for-each select="catalogo/item">

E aqui é o seu final

</xsl:for-each>

Tudo o que estiver entre essas tag’s será repetido até que todos os nós tenha sido lidos.

Para escrever os valores que estão no XML basta usar a tag value-of e no atributo select colocar o campo que deseja conforme o exemplo

<xsl:value-of select="Sku"/>

Adicionando critérios no XSL

Assim como em uma query é possível adicionar critérios em XSL, basta adicioná-los conforme o código abaixo na tag for-each, no primeiro exemplo o XSL trará apenas os produtos com o campo CodigoCategoria igual a 102, no segundo exemplo, todos com CodigoCategoria igual a 102 e o CodigoMarca igual 999.

<xsl:for-each select="catalogo/item[CodigoCategoria='102']">
<xsl:for-each select="catalogo/item[CodigoCategoria='102' and CodigoMarca='999']">

Usando XSL para formatar o XML

O Dot Net Framework nos dá suporte para trabalhar com arquivos XML através do Namespace System.Xml e para trabalhar com XSL com o Namespace System.Xml.Xsl

Vamos utilizar a classe XslCompiledTransform para formatar o XML com nosso XSL, essa classe é um processador de XSL e XSLT, ela é a sucessora da classe XslTransform, e segundo a MSDN oferece ganhos de performance com relação a classe antiga (e obsoleta na versão 4.0 do Dot Net Framework)

Uma das sobrecargas do construtor do XslCompiledTransform recebe um XmlReader, então carreguei o XSL dentro de um XmlReader e criei o objeto do XslCompiledTransform, o método Transform de nosso objeto XslCompiledTransform tem uma sobrecarga que recebe o xml base, uma lista de argumentos de Xslt que será passado como nulo e um objeto que terá o resultado da transformação, nesse caso é passado um StringWriter, pronto, agora o objeto StringWriter tem o XML carregado conforme as definições do XSL, tudo bem simples,

Código

Aqui está todo o código utilizado para a aplicação funcionar corretamente.

using System;
using System.Xml;
using System.Xml.Xsl;
using System.IO;
namespace GeradorXmlParceiro
{
class Program
{
static string caminhoXmlBase = @"C:\XmlBase\XmlBase.xml";
static string caminhoXsl = @"C:\Xsl\Xsl1.xsl";
static string caminhoXmlFormatado = @"C:\XmlTransformado\XmlTransformado.xml";
static void Main(string[] args)
{
CriarXmlComXsl();
}

static void CriarXmlComXsl()
{
XmlDocument xml = new XmlDocument();
xml = FormartarXmlBaseParaFormatoComXsl(caminhoXsl);
xml.Save(caminhoXmlFormatado);
}

static XmlDocument FormartarXmlBaseParaFormatoComXsl(string caminhoXsl)
{
XmlDocument xml = new XmlDocument();
XslCompiledTransform xsl = new XslCompiledTransform();
XmlDocument xmlBase = ObterXmlBase();
try
{
XmlReader reader = XmlReader.Create(caminhoXsl);
xsl.Load(reader);
StringWriter writer = new StringWriter();
xsl.Transform(xmlBase, null, writer);
xml.LoadXml(writer.ToString());
}
catch (Exception ex)
{
throw new Exception("Ocorreu um erro ao efetuar a transformação do XML.", ex.InnerException);
}
return xml;
}

static XmlDocument ObterXmlBase()
{
XmlDocument xml = new XmlDocument();
try
{
xml.Load(caminhoXmlBase);
}
catch (Exception ex)
{
throw new Exception("Ocorreu um erro ao carregar o XML.", ex.InnerException);
}
return xml;
}
}
}

É isso ai! Espero que esse artigo posso contribuir para o crescimento da comunidade! Até a próxima!

Referências

http://www.w3schools.com/xsl/

http://www.w3schools.com/xml/

http://msdn.microsoft.com/en-us/library/system.xml.xsl.xslcompiledtransform.aspx