XML ( anglicky eXtensible Markup Language ) rozšiřitelný značkovací jazyk | |
---|---|
Rozšíření | .xml |
MIME typ | application/xml [1] , text/xml [2] (zastaralé v konceptu, jehož platnost vypršela) [3] |
Vývojář | World Wide Web konsorcium |
zveřejněno | 1998 |
Typ formátu | značkovací jazyk |
Rozšířeno z | SGML |
Vyvinutý v | XHTML , RSS , Atom , KML , SVG a mnoho dalších formátů |
standard(y) |
1.0 (páté vydání), 26. listopadu 2008 [4] 1.1 (druhé vydání), 16. srpna 2006 [5] |
otevřený formát ? | Ano |
webová stránka | w3.org/XML _ |
Mediální soubory na Wikimedia Commons |
XML ( MFA : [ ˌ e k s . e m ˈ e l ], zkr. z angličtiny. e X tensible Markup L jazyk ) - "rozšiřitelný značkovací jazyk ". Doporučeno konsorciem World Wide Web (W3C). Specifikace XML popisuje dokumenty XML a částečně popisuje chování procesorů XML (programů, které čtou dokumenty XML a poskytují přístup k jejich obsahu). XML bylo navrženo jako jazyk s jednoduchou formální syntaxí , snadno vytvářet a zpracovávat dokumenty pro programy i lidi , s důrazem na použití na internetu. Jazyk se nazývá rozšiřitelný, protože neopravuje značkování používané v dokumentech: vývojář může volně vytvářet značkování podle potřeb konkrétní oblasti, přičemž je omezen pouze pravidly syntaxe jazyka. Rozšíření XML je konkrétní gramatika založená na XML a reprezentovaná slovníkem značek a jejich atributů a také sadou pravidel, která definují, které atributy a prvky mohou být obsaženy v jiných prvcích. Kombinace jednoduché formální syntaxe, uživatelsky přívětivého přístupu, rozšiřitelnosti a spoléhání se na kódování Unicode pro reprezentaci obsahu dokumentů vedla k širokému použití jak samotného XML, tak řady specializovaných jazyků odvozených z XML v široké škále softwarových nástrojů.
XML je podmnožinou SGML .
Specifikace XML popisuje jazyk a řadu problémů týkajících se kódování a zpracování dokumentů. Materiál v této části je shrnutím popisu jazyka ve specifikaci XML upravené pro tento článek.
Anglická verze dokumentu je považována za normativní, proto jsou hlavní termíny uvedeny s jejich anglickými originály.
Překlad hlavních pojmů v zásadě navazuje na překlad Specifikace do ruštiny dostupný na internetu, s výjimkou pojmů tag a deklarace . Pro výraz tag se zde používá tag překlad . U termínu deklarace je dávána přednost běžné deklaraci překladu (oproti rovněž běžné deklaraci pauzovacího papíru ).
Další překlady hlavních termínů lze nalézt v literatuře a na internetu.
Z fyzického hlediska se dokument skládá z entit , z nichž každá může odkazovat na jinou entitu. Jediným kořenovým prvkem je entita dokumentu . Obsahem entit jsou symboly.
Z logického hlediska se dokument skládá z komentářů ( anglicky comments ), deklarací ( anglicky deklarace ), elementů ( anglicky elements ), odkazů na entity ( anglicky character references ) a instrukcí pro zpracování ( anglicky processing guidelines ). To vše v dokumentu je strukturováno pomocí značek .
Fyzická strukturaEntita je nejmenší část dokumentu. Všechny entity něco obsahují a všechny mají jméno (existují výjimky, např . document entity ). Jednoduše řečeno, termín „esence“ popisuje „existující věc“, „ něco “ [6] .
Dokument se skládá z entit, jejichž obsahem jsou symboly. Všechny znaky jsou rozděleny do dvou typů: datové znaky ( English character data ) a značkovací znaky. Značky zahrnují:
Neoznačenou částí dokumentu jsou znaková data dokumentu.
Logická strukturaVšechny součásti dokumentu jsou shrnuty v prologu a kořenovém prvku . Kořenový prvek je povinnou součástí dokumentu, který tvoří celou jeho podstatu (obecně řečeno může chybět prolog). Kořenový element může nebo nemusí obsahovat své vnořené elementy, znaková data a komentáře. Prvky vnořené do kořenového prvku mohou zase zahrnovat vnořené prvky, znaková data a komentáře a tak dále. Prolog může obsahovat deklarace , pokyny pro zpracování , komentáře . Mělo by začínat deklarací XML , i když tato deklarace může být v určitých situacích vynechána.
Prvky dokumentu musí být správně vnořené : každý prvek, který začíná uvnitř jiného prvku (tj. jakýkoli prvek dokumentu jiný než kořenový prvek), musí končit uvnitř prvku, na kterém začal. Znaková data se mohou vyskytovat v prvcích buď přímo, nebo ve speciálních sekcích "CDATA" . Deklarace, instrukce pro zpracování a prvky mohou mít přiřazené atributy. Atributy se používají k přiřazení párů název-hodnota k logické jednotce textu.
Označení vždy začíná znakem <a končí znakem >.
Spolu se symboly <a >symbol také hraje zvláštní roli ve značení &. Lomené závorky označují hranice prvků, instrukce pro zpracování a některé další sekvence. Ampersand umožňuje nahradit text pomocí entit ( anglicky entity ) [6] .
Použití značkovacích znaků ve znakových datech ztěžuje rozpoznání značkovacích konstrukcí a může způsobit problém nejednoznačnosti struktury. V XML je tento problém vyřešen následovně: <, > a & nemohou být přítomny ve znakových datech a v hodnotách atributů v jejich přímé podobě, pro jejich reprezentaci jsou v těchto případech vyhrazeny speciální entity :
Symbol | Výměna, nahrazení |
---|---|
< | < |
> | > |
& | & |
Kromě toho se k použití apostrofů a uvozovek v hodnotách atributů používají následující entity :
' | 'apos; |
" | " |
Pravidlo nahrazení značkovacích znaků jejich označujícími entitami se nevztahuje na znaková data v sekcích "CDATA", ale provádí se na všech ostatních místech v dokumentu.
Číselné odkazy na znaky označují pozici kódu znaku ve znakové sadě dokumentu. Číselné odkazy na znaky mohou mít dvě formy [7] :
Příklady odkazů na číselné znaky:
V XML musí všechna jména začínat písmenem, znakem podtržítka (_) a pokračovat pouze znaky, které jsou pro jména povoleny, konkrétně: mohou obsahovat pouze písmena, která jsou součástí části písmen Unicode, arabské číslice, pomlčky, podtržítka , tečky. Vzhledem k tomu, že písmena nejsou omezena pouze na znaky ASCII, lze v názvech použít písmena z libovolného jazyka.
XML deklarace specifikuje jazykovou verzi, ve které je dokument napsán. Vzhledem k tomu, že interpretace obsahu dokumentu závisí na verzi jazyka, specifikace předepisuje začít dokument deklarací XML. V první (1.0) verzi jazyka bylo použití prohlášení nepovinné, v dalších verzích je povinné. Z deklarace se tedy určí jazyková verze a pokud deklarace neexistuje, předpokládá se verze 1.0.
Kromě XML verze může deklarace obsahovat také informace o kódování dokumentu a „zda má dokument zůstat s vlastním DTD , nebo s jedním vloženým“.
Příklad:
<?xml version="1.1" encoding="UTF-8" ?>nebo:
<?xml version="1.0" encoding="windows-1251"?>Ve všech těchto příkladech chyběl atribut „standalone“, který pouze určuje, zda se mají do dokumentu zahrnout popisy značek zvenčí. Výchozí hodnota je "ne":
<?xml version="1.0" encoding="windows-1251" standalone="no"?>pokud dokument XML odkazuje na jiné DTD, které popisují, co může dokument obsahovat, musíte uvéststandalone="no"
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>pokud dokument XML neodkazuje na jiné soubory a bude používat vlastní DTD, musíte zadatstandalone="yes"
Deklarace typu dokumentuPro deklaraci typu dokladu existuje speciální instrukce !DOCTYPE. Umožňuje vám určit pomocí jazyka DTD, které prvky jsou v dokumentu zahrnuty, jaké jsou jejich atributy, které entity lze použít a něco jiného.
Zde je například správný dokument:
<?xml version="1.0"?> <pozdrav> Dobrý den, světe! </pozdrav>Má kořenový prvek <greeting>Hello, world!</greeting>a dokument logicky existuje. Není však platný ( eng. not valid ) [8] .
Pomocí Deklarace typu dokumentu (DTD) je možné popsat jeho obsah a logickou strukturu a také přiřadit pár název-hodnota ke konkrétnímu prvku. Zde je návod, jak vypadá prolog v příspěvku Backus-Naur [9] :
prolog ::= XMLDecl? Různé* (doctypedecl Různé*)? XMLDecl ::= '<?xml' VersionInfo EncodingDecl? SDDecl? S? '?>' VersionInfo ::= S 'version' Eq ("'" VersionNum "'" | '"' VersionNum '"') Eq ::= S? '='S? VersionNum ::= '1.' [0-9]+ Různé ::= Komentář | PI | S doctypedecl ::= '<!DOCTYPE' S Jméno (S ExternalID)? S? ('[' intSubset ']' S?)? '>' DeclSep ::= PEreference | S intSubset ::= (markupdecl | DeclSep)* markupdecl ::= elementdecl | AttlistDecl | EntityDecl | Notace Decl | PI | Komentář extSubset ::= TextDecl? extSubsetDecl extSubsetDecl ::= ( markupdecl | conditionalSect | DeclSep)*Po deklaraci XML mohou následovat komentáře, pokyny pro zpracování nebo mezery [10] , ale pak následují Deklarace typu dokumentu, kde „Name“ je název kořenové značky , „ExternalID“ je externí identifikátor a „intSubset“ je deklarace označení nebo odkaz na entitu. Jak říká specifikace, je-li externí identifikátor deklarován společně s interní deklarací, pak je druhý před prvním [11] .
Například:
<?xml version="1.0"?> <!DOCTYPE pozdrav SYSTEM "hello.dtd"> <pozdrav> Ahoj světe! </pozdrav>Zde SYSTEM "hello.dtd"je " " externí identifikátor: adresa "hello.dtd" vám umožňuje použít data v dokumentu "hello.dtd" jako deklarace značek.
<?xml version="1.0" encoding="UTF-8" ?> <!Pozdrav DOCTYPE [ <!Pozdrav ELEMENT (#PCDATA)> ]> <pozdrav> Ahoj světe! </pozdrav>Zde byla značka deklarována lokálně v !DOCTYPE.
Návod na zpracováníInstrukce pro zpracování ( angl. processing direction, PI ), umožňují umístit do dokumentu instrukce pro aplikace. Následující příklad ukazuje instrukci pro zpracování xml-stylesheet, která předává pokyny v souboru my-style.css aplikaci xml-stylesheet (jako je prohlížeč) prostřednictvím atributu href:
<?xml-stylesheet type="text/css" href="my-style.css"?> KomentářKomentáře ( angl. comment ) se nevztahují na znaková data dokumentu. Komentář začíná sekvencí "<!--" a končí sekvencí "-->", kombinace znaků "--" uvnitř nemůže nastat. Znak & se nepoužívá jako označení uvnitř komentáře.
Příklad:
<!-- toto je komentář -->Prvek je koncept logické struktury dokumentu. Každý dokument obsahuje jeden nebo více prvků. Hranice prvků jsou reprezentovány počáteční a koncovou značkou . Název prvku v počáteční a koncové značce prvku se musí shodovat. Prvek může být také reprezentován prázdným tagem prvku , to znamená, že nezahrnuje další prvky a znaková data.
Tag ( anglicky tag ) je značkovací konstrukt, který obsahuje název prvku.
Počáteční značka: <element1>
Koncová značka: </element1>
Značka prázdného prvku: <empty_element1 />
V prvku lze atributy použít pouze v počáteční značce a prázdné značce prvku.
Příklad receptu označeného pomocí XML:
<?xml version="1.0" encoding="utf-8"?> <!DOCTYPE recept> < název receptu= "chléb" preptime= "5min" doba vaření= "180min" > <title> jednoduchý chléb </title> <composition> <množství složky = "3" unit= "sklo" > Mouka </ingredient> < množství složky= "0,25" unit= "gram" > Droždí </ingredient> < množství složky= "1,5" unit= "sklo" > Teplá voda </ingredient> </composition> <instructions> <step> Všechny ingredience smícháme a důkladně prohněteme. </step> <step> Uzavřete utěrkou a nechte jednu hodinu v teplé místnosti. </step> <!-- <step> Přečtěte si včerejší noviny. </step> je pochybný krok... --> <step> Znovu prohněteme, dáme na plech a dáme do trouby. </step> </instructions> </recipe> Sekce CDATAOddíl CDATA není logická jednotka textu. Sekce se může vyskytovat kdekoli v dokumentu, kde syntaxe umožňuje umístit znaková data. Sekce začíná <![CDATA[a končí ]]>. Mezi tímto označením jsou znaková data; znaková data tedy zahrnují znaky < > &v jejich bezprostřední podobě.
Správně zpracovaný dokument vyhovuje všem obecným pravidlům syntaxe XML platným pro jakýkoli dokument XML : správná struktura dokumentu, shodu názvů ve značce počátečního a koncového prvku atd. Dokument, který není ve správném formátu, nelze považovat za dokument xml.
Příklad dokumentu:
<?xml version="1.0" encoding="UTF-8"?> <!-- přihlašovací obrazovka --> <edsscript> <název sekvence = "start" > <action cmd= "triggeron" > bt* </action> <action cmd= "triggeron" > msg_generic </action> <action cmd= "disablenbb" > Všechno </action> <action cmd= "setscrtext" > @@Systém Giris@@ </action> <action cmd= "enablenbb" > vpřed, hlavní menu </action> <action cmd= "switchmsgtarget" > LOGIN_DLG </action> <action cmd= "sendmsg" > Start </action> <action cmd= "skok" > krok 2 </action> </sequence> <sequence name= "step2" > <action cmd= "waittrigger" > btnforward </action> <action cmd= "triggeron" > přihlásit se* </action> <action cmd= "disablenbb" > Všechno </action> <action cmd= "sendmsg" > šek </action> </sequence> <trigger name= "login_succeded" > <condition type= "appmsg" > přihlášení_úspěšné </condition> <sequence> <action cmd= "endscript" /> </sequence> </trigger> <trigger name= "login_unknownuser" > <condition type= "appmsg" > login_unknownuser </condition> <název sekvence = "login_unknownuser" > <action cmd= "disablenbb" > Všechno </action> <action cmd= "setscrtext" > @@hata@@ </action> <action cmd= "showhtml" > generic_neg.htm,@@Yanlış kullanıcı ismi@@,@@Lütfen kullanıcı ismini doğru giriniz.@@ </action> <action cmd= "enablenbb" > zadní </action> <action cmd= "waittrigger" > btnback </action> <action cmd= "skok" > Start </action> </sequence> </trigger> <trigger name= "login_incorrectpwd" > <condition type= "appmsg" > login_incorrectpwd </condition> <sequence name= "login_incorrectpwd" > <action cmd= "disablenbb" > Všechno </action> <action cmd= "setscrtext" > @@hata@@ </action> <action cmd= "showhtml" > generic_neg.htm,@@Hatalı parola@@,@@Lütfen parolanızı doğru giriniz.@@ </action> <action cmd= "enablenbb" > zadní </action> <action cmd= "waittrigger" > btnback </action> <action cmd= "skok" > Start </action> </sequence> </trigger> <!-- generic triggers --> <trigger name= "btnback" > <condition type= "buttonclick" > zadní </condition> <název sekvence = "btnback" > <action cmd= "triggeron" > btnback </action> </sequence> </trigger> <trigger name= "btnforward" > <condition type= "buttonclick" > vpřed </condition> <název sekvence = "btnforward" > <action cmd= "triggeron" > btnforward </action> </sequence> </trigger> <trigger name= "btnmainmenu" > <condition type= "buttonclick" > hlavní menu </condition> <sequence> <action cmd= "jumpscript" > <value label= "mainmenuscript" scope= "local" /> </action> </sequence> </trigger> <trigger name= "btnquitapp" > < condition type= "buttonclick" > ukončení aplikace </condition> <sequence name= "btnquitapp" > <action cmd= "callscript" > Quitapp.xml </action> <action cmd= "skok" > Start </action> </sequence> </trigger> <trigger name= "error_generic" > <condition type= "appmsg" > chyba* </condition> <sequence> <action cmd= "showhtml" > errdsc_null.htm,@@Hata@@ </action> <action cmd= "disablenbb" > Všechno </action> <action cmd= "enablenbb" > vpřed </action> <action cmd= "waittrigger" > btnforward </action> <action cmd= "endscript" /> </sequence> </trigger> <trigger name= "msg_generic" > <condition type= "appmsg" > msg_generic </condition> <sequence> <action cmd= "showhtml" > generic_msg.htm </action> <action cmd= "triggeron" > msg_generic </action> </sequence> </trigger> <!-- Neošetřená výjimka je vyvolána ze strany pevného kódu. --> < název spouštěče= "error_hardcodeside" > < typ podmínky= "appmsg" > error_hardcodeside </condition> <sequence> <action cmd= "triggeroff" > * </action> <action cmd= "triggeron" > btnmainmenu </action> <action cmd= "triggeron" > btnquitapp </action> <action cmd= "disablenbb" > Všechno </action> <action cmd= "enablenbb" > hlavní menu </action> <action cmd= "showhtml" > errdsc_null.htm,Hata, @@İşlem sırasında bir hata meydana geldi.@@ </action> <action cmd= "waittrigger" > btnmainmenu </action> </sequence> </trigger> </edscript>Tato část obsahuje souhrn některých ustanovení doporučení W3C týkajících se práce s dokumenty. Odpovídající doporučení mohou platit jak pro XML dokumenty, tak pro širší třídu dokumentů. Obvykle jsou poskytovány odkazy na nástroje pro správu dokumentů doporučené organizací W3C.
Specifikace vyžaduje, aby procesory podporovaly alespoň dvě kódování Unicode: UTF-8 a UTF-16 .
Specifikace XML definuje koncepty procesoru XML a aplikace . Procesor XML ( parser ) je program, který analyzuje značky a předává informace o struktuře dokumentu jinému programu, aplikaci.
Specifikace XML klade určité požadavky na procesor, aniž by ovlivňovala požadavky na aplikaci.
Dokument je platný , pokud má přidruženou definici typu dokumentu a pokud dokument vyhovuje omezením uvedeným v definici typu dokumentu.
Procesory XML se dělí do dvou tříd: ověřující a neověřující.
Validační zpracovatelé kontrolují platnost dokumentu a musí hlásit (dle volby uživatele) porušení omezení uvedených v definici typu dokumentu.
Nevalidující zpracovatelé nekontrolují platnost dokumentu, ale výše uvedené povinnosti předzpracování dokumentu jim zůstávají.
Jazyky schémat se používají k popisu typů dokumentů . Protože XML je podmnožinou jazyka SGML , zdědí jazyk Document Type Definition ( DTD ) vyvinutý pro SGML. Později byly vyvinuty další jazyky schémat, nejznámější je XML Schema , RELAX NG .
XSLT je navržen tak, aby vyřešil problém transformace dokumentu XML do jiného schématu nebo jiného formátu .
Pro formátovaný dokument (dokument připravený k vykreslení) je určen formát XSL-FO .
XPath je syntaxe pro adresování obsahu dokumentu reprezentovaného ve formě stromu. Výrazy XPath se používají v jazyce XQuery . Výrazy XPath lze obecně použít v jakémkoli kontextu, kde je vhodné použít formální odkazy na prvky stromu, zejména jako parametry metod rozhraní pro přístup k dokumentům.
XQuery je dokumentově orientovaný programovací jazyk.
Pro čtení XML existují tři možnosti API [12] .
Event API ( event-driven API, push-style API ) - XML procesor čte XML; při určité události (vzhled otevírací nebo uzavírací značky, textového řetězce, atributu) je volána funkce zpětného volání .
Stream API (také pull-style API ) - uspořádáno na způsob I/O streamů . Aplikační kód žádá procesor o části XML, který se může přes XML pohybovat pouze vpřed a zapomenout na části, které již prošly.
Object API ( Document Object Model , DOM, "model objektu dokumentu") - čte XML a znovu jej vytváří v paměti jako objektovou strukturu.
Existují také hybridní API: externí a nedůležité části jsou čteny metodou stream, zatímco vnitřní a důležité části jsou čteny metodou objektu.
Příklad kódu (C++, fiktivní API) xml :: čtečka StreamReader ( "in.xml" ); std :: název řetězce , hodnota ; čtenář . enterTag ( "dokument" ); while ( čtenář . getTag ( "věc" ) { xml :: Element * elThing = čtečka . readEntireSubtree (); věci . emplace_back (); Věc & věc = věci . zpět (); věc . jméno = elThing . requireStringAttr ( "jméno" ); věc . hodnota = elVěc . text (); }Direct Write API zapisuje XML tag po tagu, atribut po atributu.
Object API aka Document Object Model .
XML má implementace parseru pro všechny moderní programovací jazyky [17] .
Bez použití CSS nebo XSL je dokument XML ve většině webových prohlížečů vykreslen jako prostý text. Některé prohlížeče, jako je Internet Explorer , Mozilla Firefox a Opera (v Opeře zabudovaný nástroj Dragonfly ), zobrazují strukturu dokumentu jako strom, což umožňuje sbalení a rozbalení uzlů pomocí kliknutí myší.
Použití stylů CSSProces je podobný použití CSS na HTML dokument pro zobrazení. Chcete-li použít CSS při zobrazení v prohlížeči, musí dokument XML obsahovat speciální odkaz na šablonu stylů. Například:
<?xml-stylesheet type="text/css" href="myStyleSheet.css"?>To se liší od přístupu HTML, který používá prvek <link>.
Použití transformací na formát XSL-FOModerní prohlížeče patří mezi nástroje, které umí provádět transformace XSLT. V prohlížeči se taková transformace obvykle provádí pro formátování dokumentu (převod dokumentu do formátu XSL-FO). Následující příkaz v prologu dokumentu XML dává prohlížeči pokyn, aby provedl transformaci XSLT popsanou v souboru transform.xsl:
<?xml-stylesheet type="text/xsl" href="transform.xsl"?>S dokumentem XML můžete pracovat v běžném textovém editoru, ale běžné editory nepodporují strukturu dokumentu. Existují speciální XML editory , díky kterým je práce s dokumentem pohodlnější a efektivnější.
Systém správy databází DB2 umožňuje ukládat data ve formátu XML a poskytuje přístup k těmto datům pomocí jazyka XQuery.
XML je podporováno na nízké úrovni hardwaru, firmwaru a softwaru v moderních hardwarových řešeních [18] .
XML je značkovací jazyk, jinými slovy prostředek k popisu dokumentu. Je to ve výklenku dokumentů, textů, kde je podíl dat heterogenních znaků velký a podíl značek je malý - XML je úspěšné. Na druhou stranu výměna dat v otevřených systémech není omezena na výměnu dokumentů. Redundance značek XML (a pro účely návrhu jazyka je výslovně uvedeno, že stručnost není prioritou projektu) ovlivňuje situace, kdy data nezapadají do tradičního modelu dokumentu. News feed, například formátovaný pomocí syntaxe XML ( RSS , formáty Atom ), není dokumentem v tradičním slova smyslu, ale proudem stejného typu minidokumentů – podrobný a redundantní kód je v tomto případě nezbytnou součástí. přenášených dat.
W3C se obává účinnosti XML a příslušné pracovní skupiny se touto otázkou zabývají (od začátku roku 2013 nebyly vypracovány žádné normativní dokumenty).
Další situace, kdy formáty XML nemusí být nejlepším řešením, je při práci s daty s jednoduchou strukturou a malým množstvím znakových dat (datových polí). V tomto případě je podíl značek na celkovém objemu velký a programové zpracování XML může být ve srovnání s prací s daty jednodušší struktury nepřiměřeně drahé. V této oblasti se vývojáři zaměřují na nativní nástroje orientované na data, jako jsou INI , YAML , JSON .
W3C pracuje na vytvoření skriptovacího jazyka pro práci s XML (do začátku roku 2013 nebyly vypracovány žádné regulační dokumenty).
World Wide Web Consortium (W3C) | |||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
Produkty a normy |
| ||||||||||||||
Organizace |
| ||||||||||||||
NA |
| ||||||||||||||
Konference |
|
sémantický web | |
---|---|
Základy | |
Pododdíly |
|
Aplikace |
|
související témata | |
Normy |
|
Web a webové stránky | |
---|---|
globálně | |
Lokálně | |
Typy stránek a služeb |
|
Tvorba a údržba | |
Typy rozložení, stránek, webů | |
Technický | |
Marketing | |
Společnost a kultura |
Značkovací jazyky dokumentů | |
---|---|
kancelářské dokumenty | |
dobře známý | |
Méně známé |