OpenNFSe

OpenNFSe (http://www.opennfse.com.br/forums/index.php)
-   Ajuda sobre código fonte (http://www.opennfse.com.br/forums/forumdisplay.php?f=5)
-   -   XSLT, XPATH e NFSe (http://www.opennfse.com.br/forums/showthread.php?t=19)

LuizVaz 13/12/2009 07:06

XSLT, XPATH e NFSe
 
Prezados,

ainda não encontrei em local algum alguém mencionando esse artificio.

Para quem não sabe, os Browsers tem a capacidade de aplicar um StyleSheet aos XML's assim como fazem com .CSS e .HTML.

Essa funcionalidade é possível graças ao XPATH.
O XPATH é uma sintaxe de pesquisa do elementos do XML.
E funciona para qualquer membro da família XHTML também.

Um stylesheet é informado no XML usando a sintaxe abaixo:
Código:

<?xml version='1.0' encoding='ISO-8859-1'?>
<?xml-stylesheet type="text/xsl" href="nfse.xsl"?>
<GerarNfseResposta xmlns="http://www.abrasf.org.br/nfse.xsd">
...
</GerarNfseResposta>

Atualmente a PBH cometeu um engano em colocar UTF-8 no cabeçalho.
Isso causa erro na maioria dos Browsers, pois existem caracteres ISO-8859 no texto.
Como o XML é restrito, o browser não permite enganos.

Isso torna o abaixo XML não amigável, por causa dos acentos:
Código:

<?xml version='1.0' encoding='UTF-8'?>
<GerarNfseResposta xmlns="http://www.abrasf.org.br/nfse.xsd">
...
<OutrasInformacoes>NFS-e gerada em ambiente de teste. NÃO TEM VALOR JURÍDICO NEM FISCAL.</OutrasInformacoes>
...
</GerarNfseResposta>

O arquivo ainda incompleto para download está aqui:
http://www.mediafire.com/file/zt42z42zzzo/nfse_xsl.zip

Com esse arquivo você pode entender o funcionamento e adaptar para sua necessidade.

Att,
Luiz Vaz

LuizVaz 13/12/2009 07:52

Opa,

Esqueci de mencionar que a grande sacada é que o NFSE possui um namespace declarado como:
xmlns="http://www.abrasf.org.br/nfse.xsd"

Isso faz com que você tenha que definir no XSLT esse namespace para poder encontrar os elementos.
A definição é simplesmente assim:
xmlns:a="http://www.abrasf.org.br/nfse.xsd"

Usando esse namespace "a:" você pode encontrar os elementos no XML assim:
<xsl:template match="a:GerarNfseResposta">
<xsl:apply-templates select="a:ListaNfse/a:CompNfse/a:Nfse/a:InfNfse" />
</xsl:template>


Aqui estão algumas fontes sobre XSLT e XPATH:

LuizVaz 15/12/2009 04:32

Pessoal,

com o código abaixo consegui aplicar o XSL dinamicamente no XML usando PHP.
São menos de 50 linhas de código.
O resto está todo no XML e XSL.

Código:

  # print.php?u=$1&n=$2&v=$3
  # u = CNPJ
  # n = NF (ANO/NOTA)
  # v = Verificador
  # File Path CNPJ/ANO/NOTA-Verificador.xml

  $d = dirname(__FILE__);
  $u = $y = $s = $v = '';

  if(!empty($_GET['u'])){
    $u = $_GET['u'];
  }
  if(!empty($_GET['n'])){
    $y = substr($_GET['n'], 0, 4)+0;
    $s = substr($_GET['n'], 4)+0;
  }
  if(!empty($_GET['v'])){
    $v = strtolower($_GET['v']);
  }

  $f = "$d/$u/$y/$s-$v.xml";
  $x = "$d/$u/nfse.xsl";

  if (file_exists($f)){
      // Carrega o XML e o XSL
      $xml = new DOMDocument;
      $xml->load($f);
      $xsl = new DOMDocument;
      $xsl->load($x);

      // Configura o transformer
      $proc = new XSLTProcessor;
      $proc->importStyleSheet($xsl);

      // Aplica o StyleSheet
      $html  = '<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">'."\n";
      $html .= $proc->transformToXML($xml);
      $html  = str_replace('<?xml version="1.0"?>', '', $html);
      print $html;
  }
  else{
      print "Nota Fiscal Inexistente!";
  }


Lembrando que, o arquivo XML da NFSe está com Encoding UTF-8.
Isso está errado, pois a NFSe vem com caracteres ISO-8859-1 no corpo.
Portanto, façam a troca de UTF-8 para ISO-8859-1 antes chamarem as funções no PHP.
Caso contrário, receberão alguns warnings na execução.

Abaixo um Link de exemplo:
:: NFS-e - Nota Fiscal de Serviços eletrônica ::

Att,
Luiz Vaz

LuizVaz 13/08/2010 19:32

5 Anexo(s)
Para quem deseja dar uma olhada no código, segue em anexo o xml stylesheet.

O stylesheet é o nfse.xml.
Os demais arquivos são usados como informação dos campos:
CNAE (Atividade), SUBCNAE (Sub-Atividade), REGIME TRIBUTÁRIO, IBGE (Cidades).

Att,
Luiz Vaz


Horários baseados na GMT -2. Agora são 18:12.

vBulletin® Version 3.8.4
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Content Relevant URLs by vBSEO 3.3.0