Un dels avantatges de fer feina amb XML i les tecnologies associades és que les mateixes eines que hem utilitzat durant els exercicis del curs serveixen per validar i verificar el treball propi abans de lliurar-lo. A diferència d’altres formats, XML ofereix mecanismes formals de validació integrats en l’ecosistema:
xmllintpermet comprovar que un document està ben format, que compleix un DTD o que valida contra un XSD.xsltprocpermet executar transformacions i detectar errors de sintaxi o lògica a l’XSLT.
Aquesta capacitat d’autovalidació és una de les raons per les quals XML continua sent l’estàndard en contextos on la correcció i la interoperabilitat són crítiques, com la facturació electrònica, els formats documentals (OOXML, ODF) o els intercanvis de dades entre sistemes.
Aprofita aquestes eines per revisar la teva pràctica: si les comandes no retornen errors, tens una bona base; si en retornen, els missatges t’indicaran exactament on i què has de corregir.
Hauràs d’adaptar les comandes a les etiquetes i atributs que hagis usat a la pràctica.
Instal·lació d’eines #
Les eines necessàries per a dur a terme aquest correcció són les següents:
sudo apt install libxml2-utils xsltproc xmlstarletBloc 1 #
L’objectiu del bloc 1 és demostrar el domini de la sintaxi i estructura XML.
Comença verificant que el document basic.xml està ben format:
xmllint --noout basic.xmlMostra l’estructura en arbre per a verificar la jerarquia d’elements del document i aprofita per fer una primera ullada a la seva profunditat:
xmllint --xpath '//*' basic.xml | head -50Extreu el nombre de nivells màxim de profunditat:
xmlstarlet el -d basic.xml | awk -F'/' '{print NF-1}' | sort -rn | head -n 1Compta el número de videojocs:
xmllint --xpath 'count(//videojoc)' basic.xmlVerifica els camps dels videojocs llistant tots els elements fills del primer videojoc:
xmlstarlet sel -t -c "//videojoc[1]" basic.xml | xmlstarlet foVerifica que els camps específics dels videojocs existeixen:
xmllint --xpath 'count(//titol)' basic.xml
xmllint --xpath 'count(//descripcio)' basic.xml
xmllint --xpath 'count(//desenvolupador)' basic.xml
xmllint --xpath 'count(//preu)' basic.xml
xmllint --xpath 'count(//puntuacio)' basic.xml
xmllint --xpath 'count(//requisits)' basic.xmlCompta el número de videojocs amb DLCs:
xmllint --xpath 'count(//videojoc[dlcs])' basic.xmlLlista tots els valors de l’atribut id als videojocs per a verificar-los, i aprofita per comprovar que els identificadors són únics:
xmllint --xpath '//videojoc/@id' basic.xmlVerifica l’atribut moneda als preus dels videjocs:
xmllint --xpath '//preu/@moneda' basic.xmlVerifica que has usat comentaris al document XML:
grep -c '<!--' basic.xmlBloc 2 #
Els objectius del bloc 2 són, d’una banda, utilitzar espais de noms per organitzar vocabularis diferents i, d’altra, aplicar esquemes de validació DTD i XSD.
Cal verificar els espais de noms declarats i usats. Comença per imprimir el namespace de l’element arrel:
xmllint --xpath 'namespace-uri(/*)' cataleg.xmlContinua imprimint tots els espais de noms declarats al document:
xmlstarlet sel -t -m "//namespace::*[name()!='xml']" -v "concat('xmlns:', name(), '=', .)" \
-n cataleg.xml | sed 's/xmlns:=/xmlns=/' | sed 's/=\(.*\)/="\1"/' | sort -uI acaba comptant el número de vegades que has fet ús d’un espai de noms al document:
xmlstarlet sel -t -v 'count(//*[namespace-uri()!=""])' cataleg.xml && echoVerifica l’ús de prefixos comptant els elements amb prefix cat::
xmlstarlet sel -t -v 'count(//*[starts-with(name(), "cat:")])' cataleg.xml && echoI també compta el elements amb prefix joc::
xmlstarlet sel -t -v 'count(//*[starts-with(name(), "joc:")])' cataleg.xml && echoCompta el número de videojocs:
xmllint --xpath "count(//*[local-name()='videojoc'])" cataleg.xmlVerifica els camps dels videojocs llistant tots els elements fills del primer videojoc:
xmlstarlet sel -t -c "//*[local-name()='videojoc'][1]" basic.xml | xmlstarlet foVerifica que els camps específics dels videojocs existeixen:
xmllint --xpath "count(//*[local-name()='titol'])" cataleg.xml
xmllint --xpath "count(//*[local-name()='descripcio'])" cataleg.xml
xmllint --xpath "count(//*[local-name()='desenvolupador'])" cataleg.xml
xmllint --xpath "count(//*[local-name()='preu'])" cataleg.xml
xmllint --xpath "count(//*[local-name()='puntuacio'])" cataleg.xml
xmllint --xpath "count(//*[local-name()='requisits'])" cataleg.xmlCompta el número de videojocs amb DLCs:
xmllint --xpath "count(//*[local-name()='videojoc'][*[local-name()='dlcs']])" cataleg.xmlLlista tots els valors de l’atribut id als videojocs per a verificar-los, i aprofita per comprovar que els identificadors són únics:
xmllint --xpath "//*[local-name()='videojoc']/@id" cataleg.xmlVerifica l’atribut moneda als preus dels videjocs:
xmllint --xpath "//*[local-name()='preu']/@moneda" cataleg.xmlVerifica la resolució de la col·lisió de noms cercant elements amb el mateix nom local però diferent prefix. Primer, per als títol:
xmlstarlet sel -t -m "//*[local-name()='titol']" -v "name()" -n cataleg.xml | sort -uI, després, per a les descripcions:
xmlstarlet sel -t -m "//*[local-name()='descripcio']" -v "name()" -n cataleg.xml | sort -uVerifica l’ús d’xml:lang, començant primer per l’arrel:
grep -o 'xml:lang="[^"]*"' cataleg.xml | head -1I seguint amb les descripcions:
grep 'xml:lang=' cataleg.xml | grep -E '(cat|joc):descripcio' | head -5Verifica l’ús d’xml:base a l’element arrel per a definir la URI base del document:
xmllint --xpath 'string(/*/@xml:base)' cataleg.xmlSi escau, verifica que se’n faci ús a qualsevol part del document, no només a l’arrel:
xmlstarlet sel -t -m "//*[@xml:base]" -v "name()" -o " amb valor " -v "@xml:base" -n cataleg.xmlVerifica les metadades del catàleg cercant la secció info per poder revisar que conté els camps requerits:
xmllint --xpath '//*[local-name()="info"]' cataleg.xmlPer validar el document XML amb el DTD, abans revisar que el DOCTYPE està present i que enllaça al DTD:
head -5 cataleg.xml | grep -i DOCTYPEAra ja pots fer la validació amb el DTD:
xmllint --valid --noout cataleg.xmlValida el document XML amb l’XSD:
xmllint --schema cataleg.xsd --noout cataleg.xmlVerifica les restriccions de l’XSD cercant patrons, enumeracions, restriccions numèriques i tipus de dades específics:
# Cercar patrons (pattern)
grep -c 'xs:pattern' cataleg.xsd
# Cercar enumeracions
grep -c 'xs:enumeration' cataleg.xsd
# Cercar restriccions numèriques
grep -E 'minInclusive|maxInclusive|minExclusive|maxExclusive' cataleg.xsd | wc -l
# Cercar tipus de dades específics
grep -E 'xs:date|xs:decimal|xs:integer' cataleg.xsd | wc -lBloc 3 #
L’objectiu del bloc 3 és visualitzar el document XML a través d’un full d’estils.
Verifica l’enllaç al fitxer CSS dins el document XML:
grep 'xml-stylesheet' cataleg.xmlVerifica que el contingut del fitxer CSS compleix tots els requeriments de l’enunciat. Començar per l’ús de variables de CSS:
grep -c '\-\-' cataleg.cssVerifica l’ús de Grid o Flexbox:
grep -E 'display:\s*(grid|flex)' cataleg.cssVerifica l’ús de selectors d’atribut:
grep -E '\[[a-zA-Z]' cataleg.cssVerifica l’ús de pseudoelements:
grep -E '::(before|after)' cataleg.cssVerifica ús de la funció attr():
grep -c 'attr(' cataleg.cssVerifica l’ús de la pseudoclasse :hover:
grep -c ':hover' cataleg.cssVerifica l’ús de mides relatives:
grep -E '[0-9]+(em|rem|%)' cataleg.css | head -5Per a comprovar el resultat d’aplicar el full d’estils al fitxer XML, visualitza manualment el document XML al navegador que tenguis instal·lat, e.g., Firefox, Vivaldi o Brave.
Bloc 4 #
L’objectiu del bloc 4 és transformar el document XML en un document HTML.
Verifica l’estructura XSLT, començant per la declaració i els namespaces:
xmlstarlet el -v cataleg.xsl | head -1Compta el nombre de vegades que s’han usat plantilles:
grep -c 'xsl:template' cataleg.xslVerifica que s¡ha especificat que la sortida és HTML:
grep 'xsl:output' cataleg.xslVerifica que els elements XPath requerits són presents al document XSLT. Comença per l’ús de xsl:for-each per a iterar sobre el conjunt de nodes:
grep -c 'xsl:for-each' cataleg.xslVerifica l’ús de xsl:apply-templates per a l’aplicació de plantilles als nodes fills:
grep -c 'xsl:apply-templates' cataleg.xslVerifica l’ús de xsl:value-of per a extreure valors del nodes:
grep -c 'xsl:value-of' cataleg.xslVerifica l’ús de xsl:sort per a ordenar la llista de nodes:
grep -c 'xsl:sort' cataleg.xslVerifica l’ús de condicions simples a través de xsl:if:
grep -c 'xsl:if' cataleg.xslVerifica l’ús de condicions múltiples a través de xsl:choose i xsl:when:
grep -c 'xsl:choose' cataleg.xsl
grep -c 'xsl:when' cataleg.xslVerifica l’ús de variables a través de xsl:variable:
grep -c 'xsl:variable' cataleg.xslVerifica l’ús de plantilles de valor d’atribut (AVT):
grep -E '\{[@$][^}]+\}' cataleg.xsl | wc -lVerifica l’ús de valors calculats (adapta-ho al teu fitxer):
grep -E 'xsl:variable.*(sum|count)\(' cataleg.xslTambé pots fer-ho amb xmlstarlet:
xmlstarlet sel -t -m "//xsl:variable[contains(@select, 'sum(') or contains(@select, 'count(')]" \
-v "name()" -o " amb nom " -v "@name" -o " usa " -v "@select" -n cataleg.xslExecuta la transformació XSLT:
xsltproc -o cataleg.html cataleg.xsl cataleg.xmlVerifica el contingut del fitxer HTML. Comença per assegurar-te de que tengui un DOCTYPE:
grep -i DOCTYPE cataleg.htmlVerifica que has inclòs l’idioma:
grep -o 'lang="[^"]*"' cataleg.html | head -1Verifica que has inclòs estadístiques (adapta-ho al teu fitxer):
grep -iE '(total|mitjana|count)' cataleg.htmlVerifica l’existència de CSS incrustat_
grep -c '<style>' cataleg.htmlVisualitza el fitxer HTML generat al teu navegador. Valida’l a través del Markup Validation Service del W3C.
Llista de verificació manual #
Pots usar la següent plantilla per a fer un seguiment de l’autoavaluació:
Bloc 1
- Declaració XML correcta (versió, codificació).
- Estructura jeràrquica amb 3+ nivells.
- 15-20 videojocs.
- Tots els camps requerits per videojoc.
- 3+ videojocs amb DLCs.
- IDs únics i moneda als preus.
- Mínim 3 comentaris descriptius.
Bloc 2
- Namespaces
cat:ijoc:declarats i usats. - Col·lisió de noms resolta (titol o descripcio).
-
xml:langa l’arrel i descripcions. -
xml:basea recursos. - Secció metadades completa.
- DTD valida sense errors.
- XSD valida amb restriccions avançades.
Bloc 3
- Instrucció
xml-stylesheet. - Layout amb Grid o Flexbox.
- Variables CSS.
- Selectors variats (element, atribut, descendent).
- Pseudoelements
::before/::afterambattr(). - Interactivitat
:hover.
Bloc 4
- Múltiples plantilles
xsl:template. - Iteració:
for-each,apply-templates,value-of. - Ordenació:
xsl:sort. - Condicionals:
xsl:ifixsl:choose. - Variables globals amb estadístiques.
- Attribute Value Templates
{}. - HTML 5 generat amb 3 seccions.
- Només descripcions en català.