XHTML išsiskiria itin griežta semantika
**XHTML** (*eXtensible HyperText Markup Language* 'išplečiama hiperteksto žymėjimo kalba') – žymėjimo kalba, kuri turi panašias į HTML žymėjimo taisykles, tik jos sintaksė yra griežtesnė. HTML yra pagrįsta SGML, taigi yra mažiau suvaržyta (galima praleisti kai kuriuos žymenis, pavyzdžiui, neužbaigti paragrafo), tuo tarpu XHTML remiasi XML, todėl XHTML dokumentas turi būti struktūriškai tvarkingas (angl. *well-formed*).

XHTML buvo sukurtas W3C ir yra tapęs šio konsorciumo oficialia rekomendacija.

Savybės
-------

Labiau sintaksiškai suvaržytos HTML versijos poreikis atsirado padidėjus naudojamų mobiliųjų įrenginių skaičiui. Kadangi šie įrenginiai yra maži, jie neturi daug resursų, kuriuos būtų galima panaudoti struktūriškai sudėtingam HTML kodui.

Dauguma naujesnių žiniatinklio naršyklių gali dirbti su XHTML kodu, bet senesnės naršyklės XHTML kodą supranta kaip HTML. Taip pat beveik visos naršyklės, suderinamos su XHTML, gali naudoti HTML kodą. Yra nuomonių, kad šis faktas stabdo XHTML plėtrą. Nepaisant to, kad Microsoft yra pilnateisė W3C narė, šios kompanijos naršyklė Internet Explorer nėra suderinama su kai kuriomis XHTML rekomendacijomis.

Ypač naudinga XHTML savybė yra ta, kad šia žymėjimo kalba parašytame dokumente galima naudoti kitų iš XML kilusių kalbų (pvz. MathML, SVG) elementus. Vis dėlto, šią savybę galima panaudoti tik tada, kai XHTML dokumentas yra siunčiamas kaip XML (nurodant *application/xhtml+xml* MIME tipą).

Skirtumai tarp HTML ir XHTML
----------------------------

XHTML yra HTML įpėdinis. Kai kurie mano, kad XHTML yra nauja HTML versija. Tai netiesa, nes XHTML yra atskira žymėjimo kalbų šaka, o W3C žiniatiklio puslapiams siūlo naudoti HTML ir XHTML.

Skirtumai tarp HTML ir pirmosios kartos XHTML (XHTML 1.x) yra nežymūs. Daugiausia pakeitimų buvo padaryta norint HTML kalbą pritaikyti XML.

* Svarbiausias pakeitimas yra reikalavimas, kad kiekvienas kalbos žymuo (angl. *tag*) turėtų pradžią ir pabaigą, nes to reikalauja XML. HTML kalboje pabaigos žymos dažnai yra praleidžiamos, pvz. `< img src="mano_nuotrauka.jpg">`. XHTML žymą privaloma užbaigti pradžios žymoje pridedant „kreivą brūkšnį" (`< img src="mano_nuotrauka.jpg" />`) arba pridedant pabaigos žymą (`< img src="mano_nuotrauka.jpg"></img>`).
* Taip pat kiekvienas XHTML žymuo turi būti rašomas mažosiomis raidėmis, nes XML dokumente skiriamos didžiosios ir mažosios raidės. Šis reikalavimas kertasi su tam tikromis tradicijomis, kurios atsirado su HTML 2.0 – dauguma HTML kodo kūrėjų žymas rašydavo didžiosiomis raidėmis, kad galėtų lengviau vizualiai atskirti žymas nuo teksto.
* XHTML dokumente kiekvienas atributas turi būti išskirtas viengubomis (`'`) arba dvigubomis (`"`) kabutėmis. Tai nebuvo būtina SGML, taip pat ir HTML, kur kai kuriais atvejais kabutės galėdavo būti praleidžiamos.
* „Atributų minimizacija" (pvz. `< option selected>`) XHTML taip pat nėra leistina. Šis pavyzdys turėtų būti perrašytas taip: `< option selected="selected">`

Apie kitus skirtumus galima pasiskaityti W3C XHTML 1.0 specifikacijoje.

XHTML versijos
--------------

### XHTML 1.0

Pati pirmoji W3C XHTML rekomendacija – HTML buvo pakeistas taip, kad atitiktų XML sintaksę ir taisykles. XHTML 1.0 turi tris „rūšis":

* **XHTML 1.0 Strict** labai panaši į **HTML 4.01 Strict**, bet atitinka XML taisykles.
* **XHTML 1.0 Transitional** leidžia kai kuriuos pasenusius (angl. *deprecated*) elementus, pvz. `< center>`, `< u>`, `< strike>` ar `< applet>`. Transitional reikėtų naudoti siekiant suderinamumo su senomis naršyklėmis, kurios blogai interpretuoja CSS.
* **XHTML 1.0 Frameset** – leidžia HTML rėmelių (angl. *framesets*) naudojimą.

### XHTML 1.1

Naujausia W3C XHTML rekomendacija yra *XHTML 1.1: Module – based XHTML*. Ši versija yra pagrįsta XHTML 1.0 Strict. XHTML 1.1 nebėra nė vieno prezentacinio (nustatančio išvaizdą) elemento ar rėmelių. Dokumento išvaizdą privaloma nustatinėti naudojant CSS. XHTML 1.1 taip pat turi specialų *ruby markup* palaikymą, reikalingą kai kurių Rytų Azijos rašmenų palaikymui.

XHTML moduliarizacija taip pat leidžia nedidelius XHTML kodo gabalėlius panaudoti kitose XML pagrįstose aplikacijose tam tikru būdu. Tai taip pat leidžia išplėsti XHTML specialiems tikslams, pvz. pridėti savo matematinių formulių užrašymo ar rėmelių (angl. *frameset*) modulį. Tokie XHTML dokumentai jau nebeatitiks XHTML 1.1 standarto.

### XHTML 2.0

Kadangi XHTML 2.0 dar yra kuriamas, jis nėra tapęs W3C rekomendacija. Dabartinis XHTML 2.0 projektas yra kontroversiškas, nes ši XHTML versija nutrauktų suderinamumą su ankstesnėmis HTML/XHTML versijomis. Tai netgi nėra nauja XHTML versija – XHTML 2.0 yra visiškai nauja žymėjimo kalba, sukurta tam, kad patenkintų kai kuriuos poreikius, kurių nesugebėjo patenkinti XHTML 1.0 ar 1.1.

Naujos XHTML 2.0 savybės:

* HTML formos būtų pakeistos XForms standartu, kuris leistų skirtingiems įrenginiams prisiderinti formą pagal savo galimybes
* HTML rėmeliai būtų pakeisti XFrames
* DOM įvykiai (angl. *DOM Events*) būtų pakeisti XML Events, kurie naudoja XML DOM
* Bus pridėtas naujas sąrašo elemento tipas `nl`, kuris žymėtų, kad sąrašas yra skirtas navigacijai. Šis elementas pakeistų daugybę dabartyje naudojamų būdų hierarchiniam meniu pateikti.
* Bet kuris elementas galės būti nuoroda, pvz. `< li href="nuoroda.html">Nuoroda</li>` (žr. XLink)
* Kiekvienas elementas galės nukreipti lankytoją į papildomą informacijos tipą, pvz. `< p src="nemunas.jpg" type="image/jpeg">Nemunas</p>`
* `img` elemento atributo `alt`, nurodančio alternatyvų pavadinimą, nebus; alternatyvą bus galima nurodyti `img` elemento viduje, pvz. `< img src="nemunas.jpg">Nemunas</img>`
* Bus pridėtas vienintelis antraštei panaudotinas elementas `h`
* XHTML 1.1 dar likę prezentaciniai elementai `b`, `i` ir `tt` naujoje versijoje bus pašalinti. Liks tik iš dalies prezentaciniai elementai, pvz. `sup` ir `sub`. Dalis kitų žymų, pvz. `strong`, bus laikomi semantiniais, t. y. nustatančiais dokumento struktūrą, ir liks naujajame standarte.
* Bus pagerintos XHTML vertimo į RDF galimybės.

Daugiau apie XHTML 2.0 galima paskaityti septintoje XHTML 2.0 projekto šablono versijoje.

### Kitos versijos

* **XHTML Basic** – speciali XHTML versija, skirta įrenginiams, kurie dėl savo ribotų galimybių negali naudoti vieno iš didesnių XHTML standartų.
* **XHTML Mobile Profile** – ši versija sukurta Open Mobile Alliance, pagrįsta *XHTML Basic* ir skirta mobiliems telefonams. *Mobile Profile* turi tam tikrų savybių, naudingų mobiliems telefonams.

XHTML korektiškumo tikrinimas
-----------------------------

XHTML dokumentas, atitinkantis kurią nors iš oficialių XHTML specifikacijų, vadinamas *korektišku dokumentu* (angl. *valid document*). Nors XHTML turėtų būti vienodai atvaizduojamas visose naršyklėse, taip nėra. Vis dėlto, kiekvieną XHTML dokumentą rekomenduojama patikrinti tam skirtu tikrinimo įrankiu (angl. *validator*). Populiariausias iš jų – W3C Žymėjimo Tikrinimo Servisas.

Norint patikrinti XHTML ar HTML dokumentą, į jį reikės pridėti specialią eilutę, vadinamą *DOCTYPE* (*Document Type Definition*), kuri nurodytų, kuria žymėjimo kalba parašytas dokumentas. *DOCTYPE* turi būti nurodytas pačioje XHTML dokumento pradžioje, prieš `< html>` žymą. Galimos DOCTYPE XHTML dokumentui:

XHTML 1.0 Strict
`<!DOCTYPE html PUBLIC „-//W3C//DTD XHTML 1.0 Strict//EN"  
„http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">`
XHTML 1.0 Transitional
`<!DOCTYPE html PUBLIC „-//W3C//DTD XHTML 1.0 Transitional//EN"  
„http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">`
XHTML 1.0 Frameset
`<!DOCTYPE html PUBLIC „-//W3C//DTD XHTML 1.0 Frameset//EN"  
„http://www.w3.org/TR/xhtml1/DTD/xhtml1-frameset.dtd">`
XHTML 1.1
`<!DOCTYPE html PUBLIC „-//W3C//DTD XHTML 1.1//EN"  
„http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">`
XHTML 2.0
`<!DOCTYPE html PUBLIC „-//W3C//DTD XHTML 2.0//EN"  
„http://www.w3.org/MarkUp/DTD/xhtml2.dtd">`
Taip pat XHTML dokumentas turi turėti nurodytą XML vardų zoną (angl. *namespace*), kuri nustatytų naudojamą XHTML versiją. Tai dažniausiai daroma įterpiant `xmlns` atributą į `html` elementą.

XHTML 1.x pavyzdys:

`<html xmlns="http://www.w3.org/1999/xhtml">`
XHTML 2.0 taip pat reikės nustatyti ir XML Schema:

`< html xmlns="http://www.w3.org/2002/06/xhtml2/"  
xmlns: xsi="http://www.w3.org/2001/XMLSchema-instance"  
xsi: schemaLocation="http://www.w3.org/2002/06/xhtml2/ http://www.w3.org/MarkUp/SCHEMA/xhtml2.xsd">`

  

Taip pat XHTML dokumento pradžioje turėtų būti nurodyta koduotė. Tai reikėtų padaryti XML dokumento deklaracijoje ir naudojant `meta http - equiv` elementą. Jei koduotė nenustatyta, ji nustatoma į UTF-8 arba UTF-16.

### Įprastos klaidos

* „Tušti" elementai neturi baigimo žymos
	+ Neteisingai: `<br>`
	+ Teisingai: `<br />`  
	Taip pat galima naudoti: `< br></br>`, `< br/>` ir `< br />`. Senesnės naršyklės priims `< br>` ir `< br />` variantus.

* Kai kurie elementai neturi baigimo žymos
	+ Neteisingai `<p>Čia yra paragrafas.<p>Čia yra kitas paragrafas.`
	+ Teisingai: `<p>Čia yra paragrafas.</p><p>Čia yra kitas paragrafas.</p>`

* Neteisinga tvarka rašomos baigimo žymos
	+ Neteisingai: `<em><strong>Čia yra tekstas.</em></strong>`
	+ Teisingai: `<em><strong>Čia yra tekstas.</strong></em>`

* Nenustatomas paveikslėlio alternatyvus tekstas (`alt` parametras), kuris būtų rodomas neužkrovus paveikslėlio arba neįgaliesiems skirtoje naršyklėje
	+ Neteisingai: `<img src="nemunas.jpg" />`
	+ Teisingai: `<img src="nemunas.jpg" alt="Nemunas" />`
	+ Teisingai (XHTML 2.0): `<img src="nemunas.jpg">Nemunas</img>`

* Tekstas rašomas tiesiog `body` elemento viduje (tai nėra klaida *XHTML 1.0 Transitional*)
	+ Neteisingai: `<body>Čia yra tekstas.</body>`
	+ Teisingai: `<body><p>Čia yra tekstas.</p></body>`

* Blokiniai elementai teksto elementuose
	+ Neteisingai: `<em><h2>Įvadas</h2></em>`
	+ Teisingai: `<h2><em>Įvadas</em></h2>`

* Atributų reikšmės neišskiriamos kabutėmis
	+ Neteisingai: `<td rowspan=3>`
	+ Teisingai: `<td rowspan="3">`

* Tekste nekorektiškai naudojamas & ženklas (norėdami tekste parašyti & naudokite `& amp;`)
	+ Neteisingai: `<title>Young & Rubicam</title>`
	+ Teisingai: `<title>Young &amp; Rubicam</title>`

* Adresuose nekorektiškai naudojamas & ženklas (nuorodose taip pat naudokite `& amp;`)
	+ Neteisingai: `<a href="index.php?puslapis=naujienos&stilius=5">Naujienos</a>`
	+ Teisingai: `<a href="index.php?puslapis=naujienos&amp;stilius=5">Naujienos</a>`

* Elementų pavadinimuose naudojamos didžiosios raidės
	+ Neteisingai: `<BODY><P>Pats geriausias puslapis!</P></BODY>`
	+ Teisingai: `<body><p>Pats geriausias puslapis!</p></body>`

* `target` atributo naudojimas *XHTML 1.0 Strict* `a` elemente
	+ Neteisingai: `<a href="puslapis.html" target="\_blank">Atsidarys naujame puslapyje</a>`
	+ Alternatyvos: *XHTML 1.0 Transitional* arba JavaScript panaudojimas

* Atributų minimizavimas
	+ Neteisingai: `<textarea readonly>Čia negalima rašyti.</textarea>`
	+ Teisingai: `<textarea readonly="readonly">Čia negalima rašyti.</textarea>`

* `document.write()` naudojimas skriptuose vietoj naujų, DOM pagrįstų metodų, pvz. `document.createElementNS(); document.getElementById().appendChild();`

* CSS stilių ir skriptų komentavimas. XHTML komentarų turinys yra nenaudojamas.
	+ Neteisingai:

```
<style type="text/css"><!--
  p {
    color: green;
  }
--></style>

```

* + Teisingai:

```
<style type="text/css"><![CDATA[
  p {
    color: green;
  }
]]></style>

```

* + Norint geriausio suderinamumo su HTML, reikėtų naudoti:

```
<style type="text/css"><!--/*--><![CDATA[/*><!--*/
  p {
    color: green;
  }
/*]]>*/--></style>

```

Suderinamumas
-------------

Dauguma XHTML 1.0 dokumentų yra suderinami su HTML, t. y. juos gali apdoroti naršyklė, skirta HTML dokumentams. Tokie dokumentai turi būti perduoti su MIME tipu *text/html*. Naršyklė tokį dokumentą apdoros kaip „žymų sriubą" (angl. *tag soup*). XHTML dokumentą perduodant su MIME tipu *application/xhtml+xml* (nurodant šį tipą ir turėtų būti perduodami XHTML dokumentai) daugumai senesnių naršyklių iškils problemų su XHTML dokumento apdorojimu.

XHTML 1.1 moduliacinės savybės daro jį nesuderinamą su XHTML 1.0 ir HTML. Atitinkamai XHTML 2.0 yra nesuderinamas su savo „protėviais". Dėl šių ir kitų savybių XHTML susilaukė kritikos (anglų kalba).

Pavyzdys
--------

Šis pavyzdys parašytas *XHTML 1.0 Strict* dialektu.

```
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE html PUBLIC „-//W3C//DTD XHTML 1.0 Strict//EN" 
„http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" lang="lt" xml:lang="lt">

<head>
  <title>XHTML 1.0 Strict pavyzdys</title>
  <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
</head>

<body>
  <p>
    Tai yra XHTML 1.0 Strict pavyzdys.
  </p>
</body>

</html>

```

Taip pat skaitykite
-------------------

* HTML
* WML
* XML
* W3C
* CSS

Nuorodos
--------

* W3C tinklalapis
* XHTML 1.0 specifikacija
* XHTML 1.1 specifikacija
* Tekstas anglų kalba, kritikuojantis XHTML
* W3C Žymėjimo Tikrinimo Servisas