-
Notifications
You must be signed in to change notification settings - Fork 24
Description
Objetivo
Implementar validações para o elemento <table-wrap> conforme a especificação SPS 1.10 e modelo NISO JATS, aumentando a conformidade de X% para 70% (7 de 10 regras).
Nota: Algumas validações para <table-wrap> podem já estar parcialmente implementadas no repositório. Este Issue visa reavaliar, complementar e garantir cobertura completa das regras SPS 1.10 e NISO JATS table model.
Contexto
O elemento <table-wrap> especifica todas as partes de uma única tabela. Tabelas devem seguir o modelo NISO JATS com regras específicas sobre estrutura (sem <tr> no primeiro nível, <th> apenas em <thead>, <td> apenas em <tbody>). Validações corretas garantem presença de elementos obrigatórios, estrutura adequada segundo NISO JATS, e conformidade com requisitos SPS.
Conformidade atual: X de 10 regras implementadas (X%)
Meta após implementação: 7 de 10 regras (70%)
Documentação SPS
Referência oficial: https://docs.google.com/document/d/1GTv4Inc2LS_AXY-ToHT3HmO66UT0VAHWJNOIqzBNSgA/edit?tab=t.0#heading=h.tablewrap
Regras principais conforme SPS 1.10 e NISO JATS:
-
Ocorrência:
<table-wrap>pode aparecer zero ou mais vezes em:<app>,<body>,<p>,<sec>,<glossary>
-
Atributo obrigatório:
@id(obrigatório)
-
Elementos de identificação obrigatórios:
- Tabelas obrigatoriamente devem ter pelo menos
<label>OU<caption>+<title> - Na ausência de ambos os dados na tabela original, usar:
<caption><title/></caption>
- Tabelas obrigatoriamente devem ter pelo menos
-
Modelo NISO JATS table model:
- Codificação baseada em NISO JATS table model e Table Formatting
- Regras adicionais obrigatórias:
- O primeiro nível da estrutura não pode conter
<tr>(ex.://table/tré proibido) - Elemento
<th>apenas como descendente de<thead> - Elemento
<td>apenas como descendente de<tbody>
- O primeiro nível da estrutura não pode conter
-
Posicionamento:
- Tabelas devem aparecer no XML logo abaixo da primeira chamada do texto
- Exceção: apenas quando identificadas fora de
<app-group>e<supplementary-material>
-
Estrutura esperada:
<table-wrap>contém:@id(obrigatório)<label>ou<caption>+<title>(obrigatório)<table>(obrigatório)<table-wrap-foot>(opcional)
-
Elementos dentro de
<table>:<colgroup>e<col>- Agrupamento de colunas (opcional)<thead>- Cabeçalho (opcional)<tbody>- Corpo (obrigatório)<th>- Célula de cabeçalho (apenas em<thead>)<td>- Célula de dados (apenas em<tbody>)
Regras a Implementar
P0 – Críticas (implementar obrigatoriamente)
| # | Regra | Nível | Descrição |
|---|---|---|---|
| 1 | Validar presença de @id |
CRITICAL | O atributo @id é obrigatório em <table-wrap> |
| 2 | Validar presença de <label> ou <caption> |
CRITICAL | Tabela deve ter pelo menos <label> OU <caption> com <title> |
| 3 | Validar ausência de <tr> no primeiro nível |
ERROR | O primeiro nível de <table> não pode conter <tr> diretamente (//table/tr é proibido) |
| 4 | Validar <th> apenas em <thead> |
ERROR | Elemento <th> deve aparecer apenas como descendente de <thead> |
| 5 | Validar <td> apenas em <tbody> |
ERROR | Elemento <td> deve aparecer apenas como descendente de <tbody> |
P1 – Importantes (implementar se possível)
| # | Regra | Nível | Descrição |
|---|---|---|---|
| 6 | Validar presença de <table> |
CRITICAL | O elemento <table> é obrigatório em <table-wrap> |
| 7 | Validar presença de <tbody> |
WARNING | Elemento <tbody> é esperado em <table> (corpo da tabela) |
P2 – Futuras (fora do escopo deste Issue)
| # | Regra | Motivo de exclusão |
|---|---|---|
| 8 | Validar posicionamento após primeira chamada | Alta complexidade - requer análise de xref e ordem de elementos |
| 9 | Validar estrutura completa de linhas e células | Média complexidade - validação já é parcialmente feita pelo schema |
| 10 | Validar que não está em app-group ou supplementary-material quando validar posicionamento | Média complexidade - requer análise de contexto ancestral |
Arquivos a Criar/Modificar
Avaliar existentes (podem ter validações parciais):
packtools/sps/models/table_wrap.pyou similar – Verificar se modelo existepacktools/sps/validation/table_wrap.py– Verificar validações existentespacktools/sps/validation/rules/table_wrap_rules.jsonou similar – Verificar configuração
Criar (se não existirem):
packtools/sps/models/table_wrap.py– Modelo de extração de dadospacktools/sps/validation/table_wrap.py– Validaçõespacktools/sps/validation/rules/table_wrap_rules.json– Configuração de níveis de errotests/sps/validation/test_table_wrap.py– Testes unitários
Referenciar (implementações similares):
packtools/sps/validation/fig.py– Validação de figuras (estrutura similar)packtools/sps/validation/utils.py– Funções auxiliares (build_response)
Exemplos de XML
XML Válido (deve passar sem erros):
<!-- Exemplo 1: Tabela simples com label e caption -->
<body>
<sec>
<p>See <xref ref-type="table" rid="t1">Table 1</xref>.</p>
<table-wrap id="t1">
<label>TABLE I</label>
<caption>
<title>Domains and signaling questions used to analyze the risk of bias</title>
</caption>
<table>
<colgroup>
<col/>
<col/>
</colgroup>
<tbody>
<tr>
<td align="center">Domain</td>
<td align="center">Sample quality</td>
</tr>
<tr>
<td align="center">Description</td>
<td align="center">The methodology used</td>
</tr>
</tbody>
</table>
</table-wrap>
</sec>
</body>
<!-- Exemplo 2: Tabela apenas com label -->
<body>
<table-wrap id="t1">
<label>Table 1</label>
<table>
<tbody>
<tr>
<td>Data 1</td>
<td>Data 2</td>
</tr>
</tbody>
</table>
</table-wrap>
</body>
<!-- Exemplo 3: Tabela apenas com caption e title -->
<body>
<table-wrap id="t1">
<caption>
<title>Risk factors for segmental resection</title>
</caption>
<table>
<tbody>
<tr>
<td>Data 1</td>
<td>Data 2</td>
</tr>
</tbody>
</table>
</table-wrap>
</body>
<!-- Exemplo 4: Tabela sem label nem title (usar title vazio) -->
<body>
<table-wrap id="t1">
<caption>
<title/>
</caption>
<table>
<tbody>
<tr>
<td>Data 1</td>
<td>Data 2</td>
</tr>
</tbody>
</table>
</table-wrap>
</body>
<!-- Exemplo 5: Tabela com thead e tbody -->
<body>
<table-wrap id="t1">
<label>Table 1</label>
<caption>
<title>Sample data</title>
</caption>
<table>
<thead>
<tr>
<th>Header 1</th>
<th>Header 2</th>
</tr>
</thead>
<tbody>
<tr>
<td>Data 1</td>
<td>Data 2</td>
</tr>
</tbody>
</table>
</table-wrap>
</body>
<!-- Exemplo 6: Tabela com table-wrap-foot -->
<body>
<table-wrap id="t1">
<label>Table 1</label>
<caption>
<title>Results</title>
</caption>
<table>
<tbody>
<tr>
<td>Value 1</td>
<td>Value 2</td>
</tr>
</tbody>
</table>
<table-wrap-foot>
<fn>
<p>Data are expressed as means ± standard error.</p>
</fn>
</table-wrap-foot>
</table-wrap>
</body>
<!-- Exemplo 7: Tabela com fonte (attrib) -->
<body>
<table-wrap id="t1">
<label>Tabela 1</label>
<caption>
<title>Perfil das mulheres vítimas de violência</title>
</caption>
<table>
<tbody>
<tr>
<td>2018</td>
<td>71,66</td>
</tr>
</tbody>
</table>
<table-wrap-foot>
<attrib>Fonte: Adaptado de Instituto de Segurança Pública do Rio de Janeiro (2022).</attrib>
</table-wrap-foot>
</table-wrap>
</body>
<!-- Exemplo 8: Tabela com colgroup -->
<body>
<table-wrap id="t1">
<label>Table 1</label>
<caption>
<title>Data summary</title>
</caption>
<table>
<colgroup>
<col width="50%"/>
<col width="50%"/>
</colgroup>
<tbody>
<tr>
<td>Column 1</td>
<td>Column 2</td>
</tr>
</tbody>
</table>
</table-wrap>
</body>
<!-- Exemplo 9: Tabela com células mescladas (rowspan/colspan) -->
<body>
<table-wrap id="t1">
<label>Table 1</label>
<caption>
<title>Merged cells example</title>
</caption>
<table>
<thead>
<tr>
<th rowspan="2">Category</th>
<th colspan="2">Values</th>
</tr>
<tr>
<th>Value 1</th>
<th>Value 2</th>
</tr>
</thead>
<tbody>
<tr>
<td>Data A</td>
<td>10</td>
<td>20</td>
</tr>
</tbody>
</table>
</table-wrap>
</body>
<!-- Exemplo 10: Tabela com estilo (colorida) -->
<body>
<table-wrap id="t1">
<label>Tabela 1</label>
<caption>
<title>Dados coloridos</title>
</caption>
<table frame="hsides" rules="all">
<tbody>
<tr style="background-color:#E2EFD9">
<td>Header</td>
<td>Value</td>
</tr>
<tr style="background-color:#E7E6E6">
<td>Data</td>
<td>100</td>
</tr>
</tbody>
</table>
</table-wrap>
</body>XML Inválido – Caso 1: Sem @id (CRITICAL)
<body>
<table-wrap>
<label>Table 1</label>
<table>
<tbody>
<tr>
<td>Data</td>
</tr>
</tbody>
</table>
</table-wrap>
</body>Erro esperado: Atributo @id é obrigatório em <table-wrap>
XML Inválido – Caso 2: Sem nem (CRITICAL)
<body>
<table-wrap id="t1">
<table>
<tbody>
<tr>
<td>Data</td>
</tr>
</tbody>
</table>
</table-wrap>
</body>Erro esperado: Tabela deve ter pelo menos <label> OU <caption> com <title>. Na ausência de ambos, use <caption><title/></caption>
XML Inválido – Caso 3: no primeiro nível (ERROR)
<body>
<table-wrap id="t1">
<label>Table 1</label>
<table>
<tr>
<td>Data</td>
</tr>
</table>
</table-wrap>
</body>Erro esperado: O primeiro nível de <table> não pode conter <tr> diretamente. Use <tbody> para envolver as linhas (<tr>)
XML Inválido – Caso 4: fora de (ERROR)
<body>
<table-wrap id="t1">
<label>Table 1</label>
<table>
<tbody>
<tr>
<th>Header</th>
<td>Data</td>
</tr>
</tbody>
</table>
</table-wrap>
</body>Erro esperado: Elemento <th> deve aparecer apenas como descendente de <thead>, não em <tbody>
XML Inválido – Caso 5: fora de (ERROR)
<body>
<table-wrap id="t1">
<label>Table 1</label>
<table>
<thead>
<tr>
<td>Data in header</td>
</tr>
</thead>
</table>
</table-wrap>
</body>Erro esperado: Elemento <td> deve aparecer apenas como descendente de <tbody>, não em <thead>
XML Inválido – Caso 6: Sem (CRITICAL)<body>
<table-wrap id="t1">
<label>Table 1</label>
<caption>
<title>Table title</title>
</caption>
</table-wrap>
</body>
<body>
<table-wrap id="t1">
<label>Table 1</label>
<caption>
<title>Table title</title>
</caption>
</table-wrap>
</body>Erro esperado: Elemento <table> é obrigatório em <table-wrap>
XML Inválido – Caso 7: @id vazio (CRITICAL)
<body>
<table-wrap id="">
<label>Table 1</label>
<table>
<tbody>
<tr>
<td>Data</td>
</tr>
</tbody>
</table>
</table-wrap>
</body>Erro esperado: Atributo @id não pode estar vazio
XML Inválido – Caso 8:
(WARNING)<body>
<table-wrap id="t1">
<label>Table 1</label>
<table>
<thead>
<tr>
<th>Header</th>
</tr>
</thead>
</table>
</table-wrap>
</body>Erro esperado: (WARNING) Elemento <tbody> é esperado em <table> (corpo da tabela com dados)
XML Inválido – Caso 10:
<body>
<table-wrap id="t1">
<caption>
<p>Some description</p>
</caption>
<table>
<tbody>
<tr>
<td>Data</td>
</tr>
</tbody>
</table>
</table-wrap>
</body>Erro esperado: Quando há <caption>, deve conter <title>. Se não há título, use <label> ou <caption><title/></caption>
XML Inválido – Caso 9: Sem
diretamente em (ERROR)<body>
<table-wrap id="t1">
<label>Table 1</label>
<table>
<tbody>
<th>Header wrongly placed</th>
</tbody>
</table>
</table-wrap>
</body>Erro esperado: Elemento XML Inválido – Caso 11: eno primeiro nível (ERROR)<body>
<table-wrap id="t1">
<label>Table 1</label>
<table>
<tr>
<td>Row 1</td>
</tr>
<tr>
<td>Row 2</td>
</tr>
</table>
</table-wrap>
</body>Erro esperado: O primeiro nível de XML Inválido – Caso 13:ambos vazios (CRITICAL)<body>
<table-wrap id="t1">
<label></label>
<caption>
<title></title>
</caption>
<table>
<tbody>
<tr>
<td>Data</td>
</tr>
</tbody>
</table>
</table-wrap>
</body>Erro esperado: XML Inválido – Caso 12: Múltiplos
|
|---|