Ir para conteúdo

POWERED BY:

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

Atomus

XLST: acumulador

Recommended Posts

Pessoal, até então aqui na empresa vinhamos mexendo com XSLT só para a transformação de XML em HTML. Mas agora pintou um problema. No XML tem uns nós com valores e nós teriamos que apresentar a soma desses valores na tela. Tentamos usar a função "sum", mas não deu certo pq as casas decimais eram separados por vírgula. Fizemos uns esquema para "trocar" a vírgula por ponto, assim:

<xsl:value-of select="concat(substring-before(@VALOR,','),'.',substring-after(@VALOR,','))"/>

Mas pergunto-lhes: como fazer esse conteúdo ser jogado em uma variável? Como fazer essa varíavel ser acumalada?

Ex: var_x = var_x + preco

 

Tem como fazer isso em XLST? Senão, alguém tem alguma idéia de como posso fazer isso?

Compartilhar este post


Link para o post
Compartilhar em outros sites

tem sim mas naum sei decor vou atraz para você e ja posto!!

Compartilhar este post


Link para o post
Compartilhar em outros sites

<xsl:variable name="somaTotal" select="sum( ........ )"/><xsl:value-of select="$somaTotal"/>
ta ai

 

the void

Compartilhar este post


Link para o post
Compartilhar em outros sites

Cara, tentei isso q você fez com outro campo que só tem números e deu certo. Mas tá dando problema com campos com casas decimais. No arquivo XML as casas decimais vem separadas com vírgula. Tentei fazer aquele esquema que eu fiz ali em cima no que você passou e não deu erro, acho que pq o sum espera um conjunto de nós como parâmetro.

 

Olha o exemplo que eu fiz:

 

teste.xml

<?xml version="1.0" encoding="iso-8859-1"?><campos>	<campo valor="12"/>	<campo valor="22"/>	<campo valor="4"/>	<campo valor="5"/>	<campo valor="18"/></campos>

teste.xls

<?xml version="1.0" encoding="iso-8859-1"?><!-- DWXMLSource="teste.xml" --><xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"><xsl:output method="html" encoding="iso-8859-1" doctype-public="-//W3C//DTD XHTML 1.0 Transitional//EN" doctype-system="http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"/><xsl:template match="/"><html xmlns="http://www.w3.org/1999/xhtml"><head><meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1"/><title>Teste</title></head><body>	  <xsl:variable name="somaTotal" select="sum(campos/campo/@valor)"/>		  <xsl:value-of select="$somaTotal"/> </body></html></xsl:template></xsl:stylesheet>

Assim da certo. A soma é apresentada corretamente. Mas o meu problema é que os campos a serem somados estão com as malditas vírgulas. Ex:

 

<?xml version="1.0" encoding="iso-8859-1"?><campos>	<campo valor="12,0"/>	<campo valor="22,5"/>	<campo valor="4,6"/>	<campo valor="5"/>	<campo valor="18,8"/></campos>

Usando o XSL anterior obtenho um: NaN. Como converter esses valores pra float de modo que o XSL entenda corretamente?

Compartilhar este post


Link para o post
Compartilhar em outros sites

bom em primeiro lugar remomendo você pegar os valores com .(ponto) pq em qualquer lugar q você for fazer conta vai ser com ponto!!

 

ai na hora de mostrar você usa ,(virgula)

 

você ja tentou?

<?xml version="1.0" encoding="iso-8859-1"?><!-- DWXMLSource="teste.xml" --><xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"><xsl:output method="html" encoding="iso-8859-1" doctype-public="-//W3C//DTD XHTML 1.0 Transitional//EN" doctype-system="http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"/><xsl:template match="/"><html xmlns="http://www.w3.org/1999/xhtml"><head><meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1"/><title>Teste</title></head><body>	  <xsl:variable name="somaTotal" select="sum(concat(substring-before(campos/campo/@valor,','),'.',substring-after(campos/campo/@valor,',')))"/>		  <xsl:value-of select="$somaTotal"/></body></html></xsl:template></xsl:stylesheet>

ja tentou??

Compartilhar este post


Link para o post
Compartilhar em outros sites

mas você testou o código q postei??

Compartilhar este post


Link para o post
Compartilhar em outros sites

Sim. Dá esse erro:XSLT Error: The expression does not evaluate to a node-set.Source tree node: #document. (file:///X:/XSLT - xxx/xxx/foo, line 15, column 145.)

Compartilhar este post


Link para o post
Compartilhar em outros sites

Consegui!!! Achei um exemplo na Internet.

 

text.xml

<?xml version="1.0" encoding="iso-8859-1"?><campos>	<campo valor="12,0"/>	<campo valor="22,5"/>	<campo valor="4,6"/>	<campo valor="5"/>	<campo valor="18,8"/></campos>

teste.xls

<?xml version="1.0" encoding="UTF-8"?><!-- DWXMLSource="teste.xml" --><xsl:stylesheet version="1.0"xmlns:xsl="http://www.w3.org/1999/XSL/Transform"xmlns:xalan="http://xml.apache.org/xalan">  <xsl:output method="text" />  <xsl:template match="/">	<xsl:variable name="rtf">	<xsl:for-each select="campos/campo/@valor">	  <num> <xsl:value-of select="translate(.,',','.')" /> </num>	</xsl:for-each>	</xsl:variable>	<xsl:value-of select="sum(xalan:nodeset($rtf)/num)" />  </xsl:template></xsl:stylesheet>

Compartilhar este post


Link para o post
Compartilhar em outros sites

hahaha eu tava fazendo um desse para você mas como estou usando o browser para ver naum ta rolando o xalan:nodeset

hehehe mas beleza!

 

eu tava com um da microsoft

 

http://artem.savelev.com/diary/artemenglis...um_in_xslt.html

Compartilhar este post


Link para o post
Compartilhar em outros sites

×

Informação importante

Ao usar o fórum, você concorda com nossos Termos e condições.