segunda-feira, junho 18, 2007

Built-in templates

Tome-se como exemplo o seguinte XML:

<elem>Valor_1
<data>
Data_2
</data>
<data>
Data_3
</data>
</elem>

Agora vou definir uma template em que só quero ter como output os valores dentro das tags <data>:

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output omit-xml-declaration="yes"/>

<xsl:template match ="/elem/data">
<xsl:value-of select ="."/>
</xsl:template>
</xsl:stylesheet>

Como output tenho:

Valor_1
Data_2
Data_3

Porque raio aparece o "Valor_1" se só defini template para mostrar os valores dentro da tag <data>? O motivo é um dos buil-in templates. O que são buil-in templates? São templates definidas por omissão, que estão presentes mesmo que não sejam definidas explicitamente, a solução é fazer o override ao template. Neste caso o template é algo do género:

<xsl:template match ="text()|@*">
<xsl:value-of select ="."/>
</xsl:template>

Logo para obtermos o resultado desejado inicialmente o nosso ficheiro XSLT será algo do género:

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output omit-xml-declaration="yes"/>

<xsl:template match ="/elem/data">
<xsl:value-of select ="."/>
</xsl:template>

<!-- override Built-in template rule para texto e atributos dos nós -->
<xsl:template match="text()|@*"/>

</xsl:stylesheet>

Sem comentários: