XML, XSL e namespaces [RESOLVIDO]

E ai moçada,

Tenho que transformar um XML com um XSL, mas to apanhando do namespace.

O XML está assim:

[code]<?xml version="1.0" encoding="ISO-8859-1"?>

<?xml-stylesheet type="text/xsl" href="xxx.xsl"?>


Praça de Testes

<cota_p1>610.0</cota_p1>
<cota_p2>597.0</cota_p2>

[/code]

E o XSL assim:

<?xml version="1.0" encoding="ISO-8859-1"?> <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> <xsl:template match="/"> <xsl:value-of select="PerformanceDistritoRetorno/Praca"/> <xsl:for-each select="PerformanceDistritoRetorno/EstruturaPerformance"> <xsl:value-of select="cota_p1"/> - <xsl:value-of select="cota_p2"/> </xsl:for-each> </xsl:template> </xsl:stylesheet>

Acontece que por causa do namespace padrão do XML, nenhum valor é exibido depois da transformação. Porém, se eu tiro a definição do namespace do XML, tudo funciona.

Como não sou eu que gero o XML, eu gostaria de colocar o XSL para entender o namespace informado no XML.

Tentei algumas formas, porém não deu. Alguem pode ajudar?

vc ta validando o .xml com um schema ou dtd em algum momento??

O XML Beans gera as classes dele baseado num XSD que “desenha” a estrutura, porém não ocorre uma validação depois não.

Esse XML é gerado pela classe (que foi gerada pelo XML Bean).

ps: Se eu adiciono um prefixo no namespace do XML, também funciona.

Exemplo:

<PerformanceDistritoRetorno xmlns:mdc=“http://report.preformance.mdc.xxx.com.br” … >

Teste assim:

<EstruturaPerformance xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="rep:EstruturaPerformance" xmlns:rep="http://report.preformance.mdc.xxx.com.br">

nao ha erro em colocar um prefixo, mas na verdade se quise validar o documento xml com xsd, o prefixo deve estar tambem no inicio de cada tag em baixo do root

Acontece que ele nem lê o dado “Praca”. O problema é outro.

Mas eu não “deveria” mudar o XML, já que ele já vem gerado para mim, por outro componente externo. Quero adequar o XSL para o XML recebido.

Resolvi. Na verdade descobri que o XML estava vindo diferente.

Ele vem assim:

<?xml version="1.0" encoding="UTF-8"?> <rep:PerformanceDistritoRetorno xmlns:rep="http://report.preformance.mdc.abril.com.br"> <rep:Praca>São Paulo</rep:Praca> <rep:EstruturaPerformance xsi:type="rep:EstruturaPerformance" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> <rep:cota_p1>610.0</rep:cota_p1> <rep:cota_p2>597.0</rep:cota_p2> </rep:EstruturaPerformance> </rep:PerformanceDistritoRetorno>

e no XSL eu fiz isso:

<?xml version="1.0" encoding="ISO-8859-1"?> <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:rep="http://report.preformance.mdc.abril.com.br"> <xsl:template match="/"> <xsl:value-of select="pre:PerformanceDistritoRetorno/pre:Praca"/> <xsl:for-each select="rep:PerformanceDistritoRetorno/rep:EstruturaPerformance"> <xsl:value-of select="rep:cota_p1"/> <xsl:value-of select="rep:cota_p2"/> </xsl:for-each> </xsl:template> </xsl:stylesheet>