Questão nº 34
Questão de Tecnologia da Informação · CESGRANRIO BASA 01/2021 (nº 34)
Ao participar de uma equipe para desenvolvimento de um website para a intranet do banco em que trabalhava, um programador teve como missão criar uma tabela HTML a partir de um arquivo XML que indicava clientes e seus saldos.
O fragmento de XML a seguir é um exemplo da estrutura do XML do arquivo que conterá os dados.
<?xml version="1.0" encoding="UTF-8"?>
<clientes>
<cliente>
<nome>Ana Zurique</nome>
<saldo>3000</saldo>
</cliente>
<cliente>
<nome>Bernardo Washington</nome>
<saldo>4500</saldo>
</cliente>
<cliente>
<nome>Carlos York</nome>
<saldo>12345</saldo>
</cliente>
</clientes>
Para esse arquivo, a tabela gerada deve ter a seguinte aparência:

Inicialmente, o programador construiu o seguinte arquivo em XSLT:
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:template match="/">
<html>
<body>
<table border="1">
<tr>
<th>Cliente</th>
<th>Saldo</th>
</tr>
</table>
</body>
</html>
</xsl:template>
</xsl:stylesheet>
Que sequência de instruções deve substituir o comentário ``, de forma a gerar a tabela no formato apresentado?
- A```xml
<xsl:for-each select="clientes/cliente/">
<tr>
<td><xsl:value-of select="nome"/></td>
<td><xsl:value-of select="saldo"/></td>
</tr>
</xsl:for-each>
``` - B```xml
<xsl:for-each select="clientes/cliente">
<tr>
<td><xsl:value-of select="clientes/cliente/nome"/></td>
<td><xsl:value-of select="clientes/cliente/saldo"/></td>
</tr>
</xsl:for-each>
``` - C```xml
<xsl:for-each select="clientes/cliente">
<tr>
<td><xsl:value-of select="nome"/></td>
<td><xsl:value-of select="saldo"/></td>
</tr>
</xsl:for-each>
``` (alternativa correta) - D```xml
<xsl:for-each select="clientes/">
<tr>
<td><xsl:value-of select="cliente/nome"/></td>
<td><xsl:value-of select="cliente/saldo"/></td>
</tr>
</xsl:for-each>
``` - E```xml
<xsl:for-each select="clientes">
<tr>
<td><xsl:value-of select="cliente/nome"/></td>
<td><xsl:value-of select="cliente/saldo"/></td>
</tr>
</xsl:for-each>
```
Resposta comentada
Gabarito Alternativa C
Conceito-chave: No XSLT, o xsl:for-each define o contexto atual (o nó onde você está). Dentro dele, xsl:value-of busca os filhos diretos desse contexto, sem repetir o caminho inteiro. É como dizer "para cada cliente, pegue o nome e o saldo dele".
- (A) Incorreta: O
select="clientes/cliente/"tem uma barra final desnecessária e inválida; além disso, dentro do loop,nomeesaldoseriam buscados a partir de um contexto errado (o nó vazio após a barra). - (B) Incorreta: Dentro do
for-eachemclientes/cliente, usarclientes/cliente/nometenta buscar o caminho completo a partir da raiz, ignorando o contexto atual — isso repetiria o primeiro cliente em todas as linhas ou geraria erro. - (C) Correta: O
select="clientes/cliente"itera sobre cada<cliente>; dentro dele,xsl:value-of select="nome"eselect="saldo"referenciam os filhos diretos do contexto atual, gerando exatamente uma linha por cliente com seus respectivos valores. - (D) Incorreta:
select="clientes/"é inválido (barra final) e, mesmo se fosseclientes, o contexto seria o nó<clientes>, não cada<cliente>— entãocliente/nomepegaria apenas o primeiro cliente repetido. - (E) Incorreta: O
select="clientes"define o contexto como o elemento raiz<clientes>;cliente/nomeretornaria apenas o primeiro<cliente>(ou todos concatenados), não gerando uma linha por cliente.
Armadilha da banca: A alternativa B é a mais tentadora porque parece "completa" ao repetir o caminho inteiro, mas no XSLT isso quebra o contexto do loop — o correto é usar caminhos relativos ao nó atual. A pegadinha é confundir XSLT com XPath absoluto, achando que precisa repetir tudo.
Fonte: CESGRANRIO BASA 01/2021 Técnico Científico - Área de Formação: Tecnologia da Informação. Reproduzida para fins de estudo.