Els fulls d’estils CSS (Cascading Style Sheets) no són exclusius de l’HTML. Qualsevol document XML es pot visualitzar en un navegador aplicant-hi estils CSS. Això permet presentar dades XML de manera llegible sense necessitat de transformar-les a HTML.
Els avantatges d’usar CSS amb XML són:
- Senzillesa: CSS és un llenguatge conegut i fàcil d’aplicar.
- Separació: Les dades (XML) es mantenen separades de la presentació (CSS).
- Rapidesa: No cal processament addicional; el navegador aplica els estils directament.
Però també es pateixen una sèrie de limitacions:
- CSS no pot canviar l’ordre dels elements ni afegir contingut nou.
- No es poden fer operacions amb les dades.
- No es pot mostrar text que no existeixi al document.
Per a transformacions més complexes, cal usar XSLT, que veurem més endavant.
Enllaçar un full CSS #
La connexió entre un document XML i el seu full d’estils es fa mitjançant una instrucció de processament situada just després de la declaració XML:
<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/css" href="estils.css"?>
<arrel>
[..]
</arrel>Els atributs disponibles en aquesta instrucció són:
| Atribut | Descripció | Exemple |
|---|---|---|
type |
Tipus MIME del full d’estils | text/css |
href |
Ruta al fitxer CSS | estils.css, css/estils.css |
media |
Mitjà de sortida (opcional) | screen, print |
title |
Títol del full d’estils (opcional) | Estil principal |
alternate |
Si és un estil alternatiu | yes, no |
Es poden enllaçar múltiples fulls d’estils:
<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/css" href="base.css"?>
<?xml-stylesheet type="text/css" href="colors.css"?>
<?xml-stylesheet type="text/css" href="impressio.css" media="print"?>
<document>
[..]
</document>Selectors CSS #
En XML, els selectors CSS funcionen de manera similar a HTML, però s’apliquen als noms dels elements XML.
El selector d’element selecciona tots els elements amb un nom determinat:
/* Selecciona tots els elements <nom> */
nom {
font-weight: bold;
}
/* Selecciona tots els elements <alumne> */
alumne {
margin-bottom: 1em;
}El selector descendent selecciona elements dins d’altres elements:
/* Selecciona <nom> dins de <alumne> */
alumne nom {
color: navy;
}
/* Selecciona <nom> dins de <assignatura> */
assignatura nom {
color: darkgreen;
}El selector de fill directe selecciona només fills immediats:
/* Selecciona <nom> que sigui fill directe de <institut> */
institut > nom {
font-size: 1.5em;
}El selector d’atribut selecciona elements segons els seus atributs:
/* Elements amb atribut id */
[id] {
border-left: 3px solid blue;
}
/* Elements amb atribut codi="LLM" */
[codi="LLM"] {
background-color: #ffe0e0;
}
/* Elements amb atribut que comença per "A" */
[id^="A"] {
color: purple;
}Pseudoclasses CSS #
Algunes pseudoclasses útils:
/* Primer element d'un tipus */
alumne:first-of-type {
border-top: 2px solid black;
}
/* Últim element d'un tipus */
alumne:last-of-type {
border-bottom: 2px solid black;
}
/* Elements parells/senars (per a zebrat) */
alumne:nth-of-type(odd) {
background-color: #f5f5f5;
}
alumne:nth-of-type(even) {
background-color: #ffffff;
}La propietat display #
Per defecte, els elements XML no tenen cap estil de visualització definit. La propietat display és fonamental per controlar com es mostren:
| Valor | Comportament |
|---|---|
block |
Ocupa tota l’amplada, salt de línia abans i després |
inline |
Flueix amb el text, sense salt de línia |
inline-block |
Inline però accepta dimensions |
none |
No es mostra |
table |
Es comporta com una taula |
table-row |
Es comporta com una fila de taula |
table-cell |
Es comporta com una cel·la de taula |
flex |
Contenidor flexible |
grid |
Contenidor de graella |
Exemple bàsic d’ús de la propietat display:
/* Elements contenidors com a blocs */
institut, curs, assignatures, alumnes {
display: block;
}
/* Elements de dades en línia */
nom, cognoms, email {
display: inline;
}
/* Ocultar elements */
codi, data-naixement {
display: none;
}Pseudoelements CSS #
Tot i que CSS no pot crear elements nous, pot afegir contingut decoratiu amb ::before i ::after:
/* Afegir etiqueta abans del contingut */
email::before {
content: "✉ ";
}
/* Afegir separador després */
nom::after {
content: " | ";
}
/* Mostrar el valor d'un atribut */
assignatura::before {
content: "[" attr(codi) "] ";
font-weight: bold;
}Exemple complet #
Anem a aplicar un full d’estils CSS a l’exemple de l’institut que hem usat en aquesta sèrie. El document XML quedaria segons segueix:
<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/css" href="institut.css"?>
<institut>
<nom>CIFP Francesc de Borja Moll</nom>
<codi>08012345</codi>
<any-academic>2025-26</any-academic>
<curs id="ASIX" nom="Administració de Sistemes Informàtics en Xarxa">
<assignatures>
<assignatura codi="LLM">
<nom>Llenguatges de Marques i Sistemes de Gestió d'Informació</nom>
<hores>128</hores>
</assignatura>
[..]
</assignatures>
<alumnes>
<alumne id="A001">
<nom>Maria</nom>
<cognoms>García López</cognoms>
<data-naixement>2005-03-15</data-naixement>
<email>[email protected]</email>
</alumne>
[..]
</alumnes>
</curs>
</institut>Acompanyariem el document anterior amb el corresponent full d’estils CSS:
/* ----- Estils generals ----- */
institut {
display: block;
font-family: 'Segoe UI', Roboto, Arial, sans-serif;
font-size: 14px;
line-height: 1.6;
max-width: 900px;
margin: 20px auto;
padding: 20px;
background-color: #f9f9f9;
border: 1px solid #ddd;
border-radius: 8px;
}
[..]Resultat visual #
En obrir el document XML en un navegador modern (Firefox, Vivaldi, Brave), es mostrarà:
- Capçalera: Nom del centre centrat i destacat, codi i any acadèmic.
- Secció d’assignatures: Cada assignatura amb el seu codi en una etiqueta verda i les hores alineades a la dreta.
- Llistat d’alumnes: Files amb efecte zebrat, identificador en blau, nom complet i email.
- Interactivitat: Efecte hover als alumnes per ressaltar-los.
Consideracions pràctiques #
Quan és convenient usar CSS amb XML:
- Visualització ràpida: Per previsualitzar dades XML durant el desenvolupament.
- Documents simples: Quan l’estructura XML coincideix amb la presentació desitjada.
- Prototipatge: Per mostrar com es veuran les dades abans d’implementar XSLT.
Limitacions a recordar:
- No es pot reordenar: Els elements es mostren en l’ordre del document.
- No hi ha taules automàtiques: Cal usar
display: tablemanualment. - Sense lògica condicional: No es pot mostrar contingut diferent segons valors.
- Navegació limitada: Els enllaços no funcionen automàticament.
Per a presentacions elaborades o quan cal reestructurar les dades, XSLT és l’opció adequada.
Resum #
CSS ofereix una manera senzilla i directa d’aplicar estils a documents XML sense necessitat de transformació. Tot i les seves limitacions, és útil per a visualitzacions ràpides i documents amb estructures simples. La clau és entendre que CSS només pot modificar l’aparença visual, no l’estructura del document.
Exercicis pràctics #
Es proposen tres exercicis pràctics per facilitar l’aprenentatge progressiu.
Exercici 1 #
Estilització d’un catàleg de productes
Crea un document XML que representi un catàleg de productes d’una fruiteria i un full d’estils CSS per visualitzar-lo al navegador de manera atractiva.
Requisits del document XML:
- Element arrel
<fruiteria>amb el nom de la botiga. - Almenys 3 categories de productes (fruites, verdures, fruits secs…).
- Cada categoria amb almenys 3 productes.
- Cada producte ha de tenir: nom, preu (amb atribut
unitat: “kg”, “unitat”, “manat”…), origen i un atributecologic(“si”/“no”).
Requisits del full d’estils CSS:
- Usa la instrucció de processament
<?xml-stylesheet?>per enllaçar el CSS. - Defineix
displayapropiat per a cada tipus d’element (block, inline, etc.). - Aplica estils diferenciats per categoria usant selectors descendents.
- Mostra el valor de l’atribut
unitatdesprés del preu usant::afteriattr(). - Destaca visualment els productes ecològics (selector d’atribut
[ecologic="si"]). - Aplica efecte zebrat als productes de cada categoria.
- Oculta algun element que no sigui rellevant per a la visualització (per exemple, un codi intern).
Estructura suggerida:
<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/css" href="fruiteria.css"?>
<fruiteria>
<nom>Fruites Can Melció</nom>
<categoria tipus="fruites">
<producte ecologic="si">
<nom>Taronja de Sóller</nom>
<preu unitat="kg">2.50</preu>
<origen>Mallorca</origen>
</producte>
<!-- més productes... -->
</categoria>
<!-- més categories... -->
</fruiteria>Els fitxers a lliurar seran fruiteria.xml i fruiteria.css.
Validació: Comprova que el document és ben format amb xmllint o XML Validation, i obre’l amb un navegador per verificar els estils.
Exercici 2 #
Agenda de contactes amb múltiples vistes
Crea un document XML que representi una agenda de contactes i dos fulls d’estils CSS diferents: un per a visualització en pantalla i un altre optimitzat per a impressió.
Requisits del document XML:
- Almenys 6 contactes amb: nom, telèfon (amb atribut
tipus: “mòbil”, “fix”, “feina”), email, adreça i notes. - Cada contacte ha de tenir un atribut
categoria(“família”, “amics”, “feina”). - Alguns contactes poden tenir múltiples telèfons.
Requisits del CSS per a pantalla (agenda-screen.css):
- Disseny visual atractiu amb colors i espaiat.
- Icones o símbols abans dels camps (✆ per telèfon, ✉ per email, etc.) usant
::before. - Estils diferents segons la categoria del contacte (colors de fons o vores).
- Efecte hover als contactes.
- Mostra el tipus de telèfon entre parèntesis després del número.
Requisits del CSS per a impressió (agenda-print.css):
- Sense colors de fons (estalvi de tinta).
- Tipografia serif i mida adequada per a lectura en paper.
- Vores senzilles per separar contactes.
- Oculta les notes (potser contenen informació privada).
- Mostra la categoria com a text en lloc de color.
Enllaç dels dos fulls d’estils:
<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/css" href="agenda-screen.css" media="screen"?>
<?xml-stylesheet type="text/css" href="agenda-print.css" media="print"?>
<agenda>
...
</agenda>Els fitxers a lliurar seran agenda.xml, agenda-screen.css i agenda-print.css.
Validació: Obre el document al navegador i comprova ambdues vistes (usa la previsualització d’impressió del navegador per veure la versió d’impressió).
Exercici 3 #
Limitacions de CSS amb XML
Aquest exercici té com a objectiu comprendre les limitacions de CSS per estilitzar XML i identificar quan cal usar XSLT.
Part A: Intent d’estilització
Donat el següent document XML d’una llista de tasques:
<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/css" href="tasques.css"?>
<llista-tasques>
<tasca prioritat="alta" completada="no">
<titol>Preparar examen de LLM</titol>
<descripcio>Repassar XSLT i XPath</descripcio>
<data-limit>2025-02-15</data-limit>
<etiquetes>
<etiqueta>estudis</etiqueta>
<etiqueta>urgent</etiqueta>
</etiquetes>
</tasca>
<tasca prioritat="baixa" completada="si">
<titol>Comprar material oficina</titol>
<descripcio>Bolígrafs, paper, carpetes</descripcio>
<data-limit>2025-02-01</data-limit>
<etiquetes>
<etiqueta>compres</etiqueta>
</etiquetes>
</tasca>
<tasca prioritat="mitjana" completada="no">
<titol>Revisar apunts CSS</titol>
<descripcio>Selectors avançats i pseudoelements</descripcio>
<data-limit>2025-02-10</data-limit>
<etiquetes>
<etiqueta>estudis</etiqueta>
</etiquetes>
</tasca>
</llista-tasques>Crea un full d’estils CSS (tasques.css) que:
- Mostri les tasques com a targetes amb vora i ombra.
- Apliqui colors diferents segons la prioritat (alta=vermell, mitjana=taronja, baixa=verd).
- Mostri les tasques completades amb el text ratllat (
text-decoration: line-through). - Mostri les etiquetes com a “badges” en línia.
- Formateja la data límit amb un símbol de calendari (📅).
Part B: Anàlisi de limitacions
Respon les següents preguntes sobre què no es pot fer amb CSS:
- Es pot mostrar primer les tasques d’alta prioritat i després les de baixa? Per què?
- Es pot mostrar “Completada” o “Pendent” en lloc de llegir l’atribut
completada? Per què? - Es pot calcular quants dies falten fins a la data límit? Per què?
- Es pot mostrar un comptador amb el total de tasques pendents? Per què?
- Es pot convertir la data de format ISO (2025-02-15) a format europeu (15/02/2025)? Per què?
- Es pot generar una taula HTML amb les tasques ordenades per data? Per què?
Respostes
| # | Es pot fer? | Explicació |
|---|---|---|
| 1 | No | CSS no pot canviar l’ordre dels elements; es mostren segons apareixen al document |
| 2 | No | CSS pot mostrar el valor d’un atribut amb attr(), però no pot fer substitucions condicionals |
| 3 | No | CSS no pot fer càlculs amb dades del document ni accedir a la data actual |
| 4 | No | CSS no té comptadors que puguin filtrar per valor d’atribut ni mostrar totals |
| 5 | No | CSS no pot transformar ni reformatar el contingut textual dels elements |
| 6 | No | CSS no pot generar nous elements HTML; només pot estilitzar els elements XML existents |