STXT - Semantic Text
Built for humans. Reliable for machines.

STXT Esquemas (@stxt.schema)

1. Introducción
2. Terminología
3. Relación entre STXT y Schema
4. Estructura general de un Esquema
5. Un schema por namespace
6. Definición de Nodos (`Node:`)
7. Hijos (`Children:`) y namespaces cruzados
8. Cardinalidades
9. Tipos
10. Ejemplos Normativos
11. Errores de Schema
12. Conformidad
13. Schema del Schema (`@stxt.schema`)
14. Fin del Documento

1. Introducción

Este documento define la especificación del lenguaje STXT Schema, un mecanismo para validar documentos STXT mediante reglas semánticas formales.

Un schema:

2. Terminología

Las palabras clave "DEBE", "NO DEBE", "DEBERÍA", "NO DEBERÍA", y "PUEDE" deben interpretarse según RFC 2119.

Términos como nodo, indentación, namespace, inline y bloque >> mantienen su significado en STXT-SPEC.

3. Relación entre STXT y Schema

La validación mediante schema ocurre después del parseo STXT:

  1. Parseo del documento a una estructura jerárquica STXT.
  2. Resolución del namespace efectivo de cada nodo.
  3. Aplicación del schema correspondiente.

Una implementación PUEDE aplicar la validación durante el proceso de parseo, siempre que dicha validación permanezca débilmente acoplada al parser base. Esto permite detectar errores antes de finalizar el parseo completo.

4. Estructura general de un Esquema

Un documento schema DEBE tener como nodo raíz:

Schema (@stxt.schema): <namespace_objetivo>

Reglas:

Ejemplo:

Schema (@stxt.schema): com.example.docs
    Description: Schema de ejemplo
    Node: Document
        Type: GROUP
        Children:
        	Child: Autor
        	Child: Fecha
        		Max: 1
        	Child: Content
        		Min: 1
        		Max: 1
        	Child: Metadata (org.example.meta)
        		Max: 1
    Node: Autor
    Node: Fecha
        Type: DATE
    Node: Content
        Type: TEXT

5. Un schema por namespace

Para cada namespace lógico:

6. Definición de Nodos (`Node:`)

6.1 Forma básica

Node: Nombre Nodo
	Description: Descripción del nodo
    Type: Tipo
    Children:
    	Child: Nombre Hijo. Puede incluir un namespace si es distinto del namespace objetivo
    		Min: opcional, indica el número mínimo de hijos que pueden aparecer
    		Max: opcional, indica el número máximo de hijos que pueden aparecer

Reglas:

6.2 Valores en tipos ENUM

Node: Nombre Nodo
	Description: Descripción del nodo
    Type: ENUM
    Children:
    	Child: Nombre Hijo. Puede incluir un namespace si es distinto del namespace objetivo
    		Min: opcional, indica el número mínimo de hijos que pueden aparecer
    		Max: opcional, indica el número máximo de hijos que pueden aparecer
    Values:
    	Value: valor 1
    	Value: valor 2
    	Value: valor 3

El tipo ENUM, y sólo ENUM, PUEDE especificar un nodo Values con los valores permitidos mediante nodos Value. Si existe Values, DEBE contener al menos un nodo Value. Si un Node declara Type: ENUM, DEBE incluir Values.

7. Hijos (`Children:`) y namespaces cruzados

Un nodo PUEDE tener una entrada Children. Si existe Children, DEBE contener uno o más nodos Child con la información de los hijos permitidos.

Un Child PUEDE pertenecer a otro namespace, en cuyo caso se indica en el nombre del propio Child. Ejemplo:

Node: nombre del nodo
	Children:
		Child: nombre del hijo (namespace.del.hijo)
			Min: 0
			Max: 1

7.1 Nodos definidos explícitamente

Todo nodo que aparezca en Children debe tener una definición propia como Node: en su schema correspondiente.

Así evitamos hijos “fantasma” y garantizamos que todos los nodos tienen semántica definida.

Esto implica:

8. Cardinalidades

Las cardinalidades se expresan mediante los nodos Min y Max dentro de cada Child. Son enteros no negativos opcionales que indican el número mínimo o máximo de apariciones permitidas de ese hijo.

Reglas:

9. Tipos

Los tipos definen:

  1. La forma del valor del nodo (inline, bloque >>, o ninguno).
  2. Si el nodo es compatible con hijos.
  3. La validación del contenido.

Se definen dentro de Node, mediante un elemento Type. Ejemplo:

Node: nombre del nodo
	Type: TIPO_DEL_NODO
	Children:
		Child: Nombre Hijo

Otras consideraciones:

9.1. Tipos estructurales básicos

Una implementación conforme DEBE admitir estos tipos y DEBE validar su estructura.

Tipo Formas de texto Hijos compatibles Descripción / Validación
INLINE INLINE Texto inline :. Tipo por defecto. Puede tener hijos.
BLOCK BLOCK NO Sólo bloque >> de texto. No puede tener hijos.
TEXT INLINE/BLOCK NO Texto genérico. Puede ser inline : o bloque >>.
GROUP NONE No admite valor textual. Sólo hijos estructurados.

9.2. Tipos Básicos de contenido INLINE

Una implementación conforme DEBE admitir estos tipos y DEBE validar su estructura.

Tipo Formas de texto Hijos compatibles Descripción / Validación
BOOLEAN INLINE true o false.
NUMBER INLINE Número con formato JSON.
ENUM INLINE Sólo valores especificados (ver 9.5)

9.3. Tipos ampliados de contenido INLINE

Una implementación conforme DEBE admitir estos tipos y DEBERÍA validar su estructura.

Tipo Formas de texto Hijos compatibles Descripción / Validación
INTEGER INLINE Número sin decimales (positivos y negativos).
NATURAL INLINE Números mayores o iguales a 0 sin decimales.
DATE INLINE Fecha YYYY-MM-DD.
TIME INLINE Hora ISO 8601, hh:mm:ss.
TIMESTAMP INLINE Timestamp ISO 8601 completo.
UUID INLINE UUID canónico.
URL INLINE URL o URI válida.
EMAIL INLINE Dirección de correo válida.

9.4. Tipos ampliados de contenido binario INLINE/BLOCK

Una implementación conforme DEBE admitir estos tipos y PUEDE validar su estructura.

Tipo Formas de texto Hijos compatibles Descripción / Validación
HEXADECIMAL INLINE / BLOCK NO [0-9A-Fa-f]+. Cadena hexadecimal.
BINARY INLINE / BLOCK NO [01]+. Cadena binaria.
BASE64 INLINE / BLOCK NO Contenido Base64 válido.

9.5. Tipo ENUM

El tipo ENUM permite enumerar de forma explícita los valores permitidos para un nodo. Reglas:

Ejemplo:

Node: Nombre Nodo
    Type: ENUM
    Values:
    	Value: valor 1
    	Value: valor 2
    	Value: valor 3

Una implementación conforme DEBE comprobar los tipos ENUM contra sus valores permitidos y DEBE rechazar cualquier valor que no coincida exactamente con uno de ellos.

10. Ejemplos Normativos

10.1. Schema con referencias cross-namespace

Schema (@stxt.schema): com.example.docs
    Node: Document
        Type: GROUP
        Children:
            Child: Metadata (org.example.meta)
            	Max: 1
            Child: Content
            	Min: 1
            	Max: 1
    Node: Content
        Type: BLOCK

Y en org.example.meta:

Schema (@stxt.schema): org.example.meta
    Node: Metadata
    	Type: INLINE

10.2. Documento válido

Document (com.example.docs):
    Metadata (org.example.meta): info
    Content>>
        Línea 1
        Línea 2

11. Errores de Schema

Un schema es inválido si:

  1. Define dos Node con el mismo nombre canónico.
  2. Usa un Type desconocido.
  3. Define Children en un Node cuyo tipo no permite hijos.
  4. La cardinalidad es inválida.
  5. Un Node: ENUM no define Values, o Values no contiene ningún Value.
  6. Aparece un Value duplicado tras la normalización inline por trim.
  7. Aparecen dos nodos Child equivalentes dentro del mismo Children.
  8. Aparece un hijo en Children cuyo Node no está definido en su schema correspondiente.

12. Conformidad

Una implementación es conforme si:

13. Schema del Schema (`@stxt.schema`)

Esta sección define el schema oficial del propio sistema de schemas: el meta-schema que valida todos los documentos del namespace @stxt.schema.

13.1. Consideraciones

13.2. Meta-Schema completo

Schema (@stxt.schema): @stxt.schema
    Node: Schema
        Children:
            Child: Description
                Max: 1
            Child: Node
                Min: 1
    Node: Node
        Children:
            Child: Type
                Max: 1
            Child: Children
                Max: 1
            Child: Description
                Max: 1
            Child: Values
                Max: 1
    Node: Children
       	Type: GROUP
        Children:
            Child: Child
                Min: 1
    Node: Description
        Type: TEXT
    Node: Child
        Children:
            Child: Min
                Max: 1
            Child: Max
                Max: 1
    Node: Min
        Type: NATURAL
    Node: Max
        Type: NATURAL
    Node: Type
        Type: ENUM
        Values:
            Value: INLINE
            Value: BLOCK
            Value: TEXT
            Value: GROUP
            Value: BOOLEAN
            Value: NUMBER
            Value: ENUM
            Value: INTEGER
            Value: NATURAL
            Value: DATE
            Value: TIME
            Value: TIMESTAMP
            Value: UUID
            Value: URL
            Value: EMAIL
            Value: HEXADECIMAL
            Value: BINARY
            Value: BASE64
    Node: Values
        Type: GROUP
        Children:
            Child: Value
                Min: 1
    Node: Value

13.3. Lectura rápida

13.4. Ejemplo mínimo válido

Schema (@stxt.schema): com.example.docs
    Node: Document

13.5. Ejemplo completo

Schema (@stxt.schema): com.example.docs
    Description: Schema de ejemplo
    Node: Document
        Type: GROUP
        Children:
        	Child: Title
        		Min: 1
        		Max: 1
        	Child: Author
        	Child: Metadata (org.example.meta)
        		Max: 1
    Node: Title
        Type: INLINE
    Node: Author
        Type: INLINE

14. Fin del Documento