XML, XSL e namespaces [RESOLVIDO]

7 respostas
danieldestro

E ai moçada,

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

O XML está assim:

<?xml version="1.0" encoding="ISO-8859-1"?>
<?xml-stylesheet type="text/xsl" href="xxx.xsl"?>
<PerformanceDistritoRetorno xmlns="http://report.preformance.mdc.xxx.com.br" 
           xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
  <Praca>Praça de Testes</Praca>
  <EstruturaPerformance xsi:type="rep:EstruturaPerformance" 
            xmlns:rep="http://report.preformance.mdc.xxx.com.br">
    <cota_p1>610.0</cota_p1>
    <cota_p2>597.0</cota_p2>
  </EstruturaPerformance>
</PerformanceDistritoRetorno>

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?

7 Respostas

Ticianne

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

danieldestro

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” … >

peczenyj

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">

Ticianne

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

danieldestro

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

danieldestro

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.

danieldestro

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>

Criado 19 de maio de 2006
Ultima resposta 19 de mai. de 2006
Respostas 7
Participantes 3