¿HTML5 prohíbe las celdas de tbody?

4 minutos de lectura

Tengo el siguiente marcado como parte de una vista de Razor:

<table>
  <caption>Presidents</caption>
  <thead>
    <tr>
      <th scope="col">Name</th>
      <th scope="col">Born</th>
      <th scope="col">Died</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <th scope="row">Washington</th>
      <td>1732</td>
      <td>1799</td>
    </tr>
    <!-- etc -->
  </tbody>
</table>

Con el “esquema de destino para la validación” establecido en HTML5, Visual Studio se queja así:

Advertencia 1 Validación (HTML5): El elemento ‘th’ no debe estar anidado dentro del elemento ‘tbody tfoot’.

¿Es esto realmente cierto? Si es así, ¿alguien podría vincular a la especificación?

Mi entendimiento fue que usar <th> para los encabezados de fila no solo era legal sino que se alentaba. Ciertamente parece bastante común, podría vincular docenas de tutoriales explicando (aparentemente con sensatez) que ayuda con la accesibilidad.

¿Es esto un error VS? ¿Se avecina un cambio real con HTML5 (¿uno bueno? ¿uno malo?)? ¿Cuál es la historia?

  • ¿Su código de acción, en lugar de <!-- etc -->, contiene algún código anidado no válido? A <th> sin un <tr> ¿por ejemplo?

    – Gareth

    1 de abril de 2011 a las 5:20

  • Gareth, buena pregunta, pero no, no es así. Solo quería sugerir que hay más de una fila similar. Lo probé solo con uno y solo redujo las copias duplicadas de la misma advertencia (una para cada una de esas celdas).

    – Doug McClean

    1 de abril de 2011 a las 11:22

avatar de usuario
PernoReloj

Mi entendimiento fue que usar <th> para los encabezados de fila no solo era legal sino que se alentaba

Hasta donde yo sé, esto siempre fue legal en HTML 4 (y posiblemente en sus predecesores) y no ha cambiado en HTML5.

Validador HTML5 de W3C, aunque aún es experimental, no informa advertencias ni errores. Por otra parte, estoy seguro de que la validación de HTML5 que utiliza Visual Studio también es experimental, ya que HTML5 aún no se ha finalizado.

los especificación HTML5 en el marcado de datos tabulares, específicamente sección 4.9.13muestra el uso de <th> dentro de <tbody> y <tfoot> para medir el alcance de los datos de la fila:

<table>
 <thead>
  <tr>
   <th>
   <th>2008
   <th>2007
   <th>2006
 <tbody>
  <tr>
   <th>Net sales
   <td>$ 32,479
   <td>$ 24,006
   <td>$ 19,315
  <tr>
   <th>Cost of sales
   <td>  21,334
   <td>  15,852
   <td>  13,717
 <tbody>
  <tr>
   <th>Gross margin
   <td>$ 11,145
   <td>$  8,154
   <td>$  5,598
 <tfoot>
  <tr>
   <th>Gross margin percentage
   <td>34.3%
   <td>34.0%
   <td>29.0%
</table>

Así que es perfectamente legítimo tener <th> elementos dentro <tr> elementos dentro de un <tbody> o <tfoot>. Como debería ser de todos modos, ya que los encabezados de las tablas no solo se encuentran en los encabezados de las tablas.

  • Estoy de acuerdo. yo creé problema 656626 para reportar esto.

    – Doug McClean

    1 de abril de 2011 a las 11:35

  • @Doug McClean: ¿Algún comentario sobre el validador HTML5 de VS11? No estoy seguro si es diferente del VS2010.

    – BoltClock

    19 de marzo de 2012 a las 17:22

  • @BoltClock Todavía no he tenido la oportunidad de jugar con VS11.

    – Doug McClean

    19 de marzo de 2012 a las 18:36

  • Podría arreglar las advertencias en VS2010 cambiando el html_5.xsd y xhtml_5.xsd, basado en la respuesta de Chris. Abre el archivo, encuentra la línea. <xsd:element ref="th" vs:disallowedancestor="tbody tfoot" /> y cambiarlo a <xsd:element ref="th" />.

    – Corbata

    29 de abril de 2013 a las 0:35

La especificación HTML5 solo requiere que sea dentro de un try la especificación en realidad incluye un ejemplo con un th anidado dentro de un tbody.

Generalmente un TH en un THEAD tendrá un scope valor de "col" mientras que un TH en un TBODY tendrá un scope valor de "row".

¿Ha sido útil esta solución?