Otvorené formáty súborov kancelárskych softvérov
![]() |
Trenčianska Univerzita Alexandra Dubčeka v Trenčíne
Fakulta Mechatroniky |
![]() |
Autor: | Lukáš Krajči |
Pedagogický vedúci: | Ing. Juraj Ďuďák |
Študijný odbor: | Mechatronika
|
Akademický rok |
2009/2010
|
1. | XML, XPath, XSLT a XQuery |
2. | Otvorené formáty kancelárskych softvérov |
3. | Aplikácia pre prezeranie dokumentov OO XML
|
Obsah
Abstrakt
Práca sa zaoberá spôsobmi uchovávania dát v súboroch kancelárskych softvérov MS Office 2007 a Open Office 3.0. Rozoberá technológie použité pri ukladaní týchto dát a vnútornú štruktúru uložených dokumentov. Taktiež opisuje problematiku vytvorenia webovej aplikácie pre prezeranie súboru vybraného typu. |
Abstract
The work deals with techniques of storying data in the files of the office software MS Office 2007 and OpenOffice.org 3.0. Analyzes the technologies used for the data storying and the internal structure of the stored documents.It also describes issues of creating a web-based application for viewing the selected file type. |
XML, XPath, XSLT a XQuery
Úvod
Začiatkom osemdesiatych rokov dvadsiateho storočia IBM, DEC a ďalšie veľké priemyselné firmy prišli k dohode o potrebe štandardu pre výmenu údajov medzi rôznymi počítačmi. Ich iniciatíva viedla k vzniku štandardu ISO (International Organization for Standardization) s číselným označením 8879 z roku 1986. Obsahuje definíciu SGML (Standard Generalized Markup Language). Je to jazyk, ktorého cieľom bolo umožniť zdieľanie informácií medzi podnikmi s rozdielnymi informačnými systémami. Umožňuje oddeliť dáta od ich spracovania. Na základe analýzy štruktúry dát sa vytvára slovník, označovaný ako DTD (Document Type Definition). Tento slovník naznačuje obsah jednotlivých objektov tzv. objektovým modelom s presne definovanou syntaxou. Pretože rôzne množiny údajov môžu mať rôzne dátové objekty, líšia sa aj ich slovníky DTD. Dokument SGML je vytváraný ako textový dokument. Jednotlivé prvky dokumentu sú oddelené značkami, ktoré sú definované v slovníku DTD. Ako text je dokument prenositeľný na rôzne systémy, ktoré majú implementovaný analyzátor SGML dokumentov. Analyzátor tento dokument načíta, s využitím slovníka DTD a značiek v dokumente je schopný určiť štruktúru dokumentu a spracovať jeho obsah. Nevýhodou štandardu SGML bolo, že nebol schopný reagovať na požiadavky webu. Vznikol v dobe pomalých a drahých počítačov. Aby bolo možné z týchto systémov získať maximum, štandard SGML bol vybavený minimalizačnými nástrojmi. Tie mali výsledné textové súbory dokumentov stlačiť na čo najmenšiu veľkosť. Dôsledkom boli zložité, drahé a pomalé analyzátory a veľká finančná náročnosť zavádzania SGML do praxe. Skutočnosť, že SGML je štandardom ISO, sa premietla do odmietnutia zmien, ktoré smerovali k jeho zjednodušeniu. Zjednodušenia boli požadované pre možnosť použitia štandardu pri výmenu údajov vo webe a pre možnosť zobrazenia dokumentov prehliadačmi. Namiesto priameho použitia štandardu SGML ako celku veľké rozšírenie získala iba jeho aplikácia HTML - HyperTextMarkup Language. Pôvodcom jazyka je Tim Berners-Lee. Veľký ohlas mala verzia 2.0, ktorú Berners-Lee a D. Connolly zverejnili v novembri 1995 ako RFC1866. Ďalším medzníkom je január 1997. Bolo zverejnené odporúčanie W3C (World Wide Web Consorcium) HTML 3.2. Ale ani vtedy sa vývoj HTML neskončil. Pokračovalo pridávanie nových značiek. Objavila sa možnosť tvorby skriptov. Doplnené boli kaskádové štýly, formuláre, rámce. Popri statických HTML dokumentoch, čím ďalej tým viac údajov na webových serveroch sa ukladá v databázach. Čím ďalej tým viac dokumentov sa vytvára dynamicky programami alebo skriptami s využitím údajov v databázach. Rozširuje sa eBusines, eLearning, eBanking. Narastajú požiadavky na výmenu údajov medzi strojmi. HTML bolo pôvodne určené pre prezentáciu textov. Človek, čitateľ, si z textu potrebnú informáciu vyberie. Aby to však mohli robiť aj stroje, je potrebné dôslednejšie formátovať údaje a treba mať jasné pravidlá, podľa ktorých je možné zistiť, či sú údaje úplné. HTML k tomu nestačí, SGML je zložité a z tohto dôvodu vzniklo XML. V roku 1996 bola pod záštitou W3C vytvorená pracovná skupina, ktorej cieľom malo byť zjednodušenie SGML pre potreby webu. Okrem širokej akceptovateľnosti výsledného štandardu pre potreby webu sa mala dosiahnuť aj možnosť jednoduchej tvorby programov pre spracovanie XML dokumentov. Prvá verzia odporúčania XML bola zverejnená vo februári 1998. V októbri roku 2000 bola zverejnená revízia tohto odporúčania pod názvom Extensible Markup Language (XML) 1.0 (Second Edition). Odporúčanie definuje, čo je to XML dokument, čo je prvok (element), jeho počiatočné a koncové ohraničenie, značka, atribúty aj obsah prvku. Určuje pravidlá pre voľbu názvov prvkov - značiek, atribútov. Stanovuje tiež, kedy je dokument dobre sformovaný (well-formed - niekedy prekladané tiež správne sformátovaný) a tiež kedy je dokument platný (valid). Následne vznikla špecifikácia XHTML 1.0. Špecifikácia XHTML 1.0 je v podstate prepracovaným HTML 4.01 tak, aby splňovalo obmedzenia kladené na jazyk XML. Takže XHTML je aplikáciou XML. Množina elementov a atribútov je plne zdedená z HTML 4.01. Okrem obmedzení, ktoré vznikli z dôvodu dodržovania prísnejšej syntaxe jazyka XML, ďalej definuje špecifikáciu niekoľkých doporučených postupov, ktoré majú zaistiť spätnú kompatibilitu XHTML dokumentov s HTML prehliadačmi.
Obrázok 1.1 Vzťah SGML, XML, HTML a XHTML
XML
Štruktúra dokumentu
XML je v skutočnosti metajazyk, čo znamená, že je to jazyk, ktorý sa používa na popis ďalších jazykov. Neexistuje preddefinovaný zoznam elementov. XML poskytuje úplnú slobodu pri vytváraní prvkov, ktorých mená majú pre danú aplikáciu zmysel.
Na tomto jednoduchom príklade si ukážeme čo vlastne XML je a ako vyzerá:

Ako ste si asi mohli všimnúť, je to krátka správa od Jany pre Tomáša. Toto je jedna z nesporných výhod XML, je veľmi dobre čitateľné a zrozumiteľné aj pre bežného užívateľa. Teraz si poďme popísať čo všetko v tomto príklade môžeme vidieť.
Prvý riadok v dokumente – XML deklarácia – definuje verziu XML a kódovanie znakov, ktoré si prajeme použiť. V tomto prípade sa jedná o špecifikáciu XML 1.0 a používaná znaková sada je ISO-8859-2 (Stredoeurópske jazyky).
Druhý riadok dokumentu predstavuje tzv. koreňový element dokumentu s názvom „sprava“. Koreňový element je hlavný element celého dokumentu, je vždy iba jeden a všetky elementy sú mu v hierarchii dokumentu podriadené. Podriadené elementy sa nazývajú potomkovia. V našom prípade sú potomkovia elementy s názvom: pre, od, zahlavie, telo. Na konci dokumentu je uzavierací tag koreňového elementu </sprava> ktorým sa končí každý XML dokument.
Syntaktické pravidlá XML
- Každý prvok XML dokumentu musí mať otvárací (<názov elementu>) aj uzavierací tag (</názov elementu>). Ak je daný element prázdny, môžeme použiť nasledujúcu skrátenú syntax: (<názov elementu/>). Ukončovací tag značí, že to, čo bude nasledovať v dokumente ďalej, už nepatrí danému elementu.
- XML rozlišuje veľké a malé písmená v názve tagu. Z tohto vyplýva, že začiatočný, aj ukončovací tag, musia byť rovnako napísané.
- Elementy musia byť v XML dokumente správne zahniezdené
Na rozdiel od jazyka HTML kde by bez problémov fungoval takýto zápis:
<b><i> Tento text je tučný a kurzívou</b></i>
V dokumentoch XML by táto syntax nebola správne a je potrebné ju pozmeniť nasledujúcim spôsobom:
<b><i> Tento text je tučný a kurzívou</i></b>
- Atribúty elementu musia byť uzavreté v úvodzovkách
Toto je element ktorý má nejaký atribút: <auto farba=”cierna”> , atribúty detailnejšie popisujú daný element. Musia byť uzavreté v jednoduchých (‘ ‘), alebo zložených
(“ “) úvodzovkách. Sú povolené 2 druhy úvodzoviek, lebo ak samotný atribút obsahuje jeden druh úvodzoviek, na jeho uzavretie sa použije ten druhý druh.
- Ukázali sme si ako sa zapisuje atribút elementu. Z tohto zápisu vidno že názov elementu nesmie obsahovať medzeru, pretože reťazec za medzerou by bol považovaný za atribút. Toto sa rieši nasledovne: <nazov_elementu>
- XML zachováva tzv. Biele znaky. Ak ste zvyknutý z jazyka HTML že viac medzier za sebou sa zmení na jednu, tak v XML sa zachovajú všetky znaky presne tak ako sú zapísané v dokumente.
- XML používa pre označenie konca riadka výhrade znak LF(line feed), pre toto označenie ešte existuje znak CR(carriage return). Ak by sa však takýto znak v dokumente objavil, automaticky sa prevedie na LF.
- Komentáre sa v XML zapisujú takto: <!-- Toto je komentár -->
- V XML existujú tzv. špeciálne znaky (escape characters), ktoré sa nesmú v názvoch a ani v obsahu elementov vyskytnúť. Miesto nich sa používajú tzv. HTML entity ako ukazuje nasledujúca tabuľka:
- Ak z nejakého dôvodu potrebujeme použiť špeciálne znaky a nevyhovuje nám použitie ekvivalentných reťazcov, môžeme použiť CDATA sekciu. Sekcia CDATA začína <![CDATA[ a končí ]]>. Všetko vo vnútri je ignorované parserom, takže je možné bez obáv písať špeciálne znaky. CDATA sekcia sa využíva hlavne ak potrebujeme v XML dokumente uviesť kód napísaný v ľubovoľnom programovacom jazyku. V takomto prípade je použitie HTML entít namiesto špeciálnych znakov neprípustné. Je však z pochopiteľných dôvodov zakázaná kombinácia znakov ]]>.
Menné priestory
Vzhľadom k tomu, že XML umožňuje návrhárom zvoliť si svoje vlastné mená elementov, môžu si dvaja alebo viacerí návrhári pre niektoré elementy vybrať rovnaké meno. Menné priestory (Namespaces) prinášajú spôsob, ako od seba odlíšiť elementy, ktoré majú rovnaké lokálne meno, ale pochádzajú z rôznych „slovníkov“. Rozlíšenie elementov sa dosiahne asociáciou elementu s menným priestorom. Menný priestor má meno utvorené podľa špecifikácie URI. Toto URI slúži ako unikátny reťazec. Meno menného priestoru a lokálne meno elementu tvoria globálne unikátne meno, ktorému sa hovorí kvalifikované meno (qualified name).
Menný priestor sa deklaruje vo vnútri počiatočnej značky elementu. Táto deklarácia slúži k spojeniu mena menného priestoru s iným obvykle kratším reťazcom, ktorému sa hovorí prefix menného priestoru (namespace prefix). Syntax deklarácie menného priestoru je xmlns:prefix_menného_priestoru="URI_menného_priestoru". Je tiež možné deklarovať východzí menný priestor ktorý sa aplikuje na všetky elementy bez prefixu. Syntax deklarácie východzieho menného priestoru je xmlns="URI_menného_priestoru".
Element môže obsahovať maximálne jednu deklaráciu východzieho menného priestoru. Ostatných deklarácií menných priestorov môže element obsahovať ľubovoľné množstvo, ak má každá z nich iný prefix. Je možné priradiť rovnaké URI viacerým prefixom, no nie je to nijako užitočné.
Všetky deklarácie menných priestorov majú rozsah platnosti (scope) – tj. množinu elementov na ktoré sa vzťahujú. Do rozsahu platnosti deklarácie menného priestoru patrí element, v ktorom sa táto deklarácia nachádza, a všetci jeho potomkovia. Mapovanie prefixu môže byť v rozsahu jeho platnosti prekryté novou deklaráciou u potomka. Taktiež východzí menný priestor u potomka môže byť prekrytý jeho novou deklaráciou.
Elementom ktoré neležia mennom priestore sa hovorí nekvalifikované elementy (unqualified elements) menom menného priestoru nekvalifikovaného elementu je prázdny reťazec. Ak je element v rozsahu platnosti deklarácie východzieho menného priestoru a potrebujeme z neho urobiť nekvalifikovaný element, je možné deklaráciu východzieho menného priestoru prekryť novou deklaráciou v tomto elemente v tvare xmlns=‘ ‘.
Nasledujúci príklad ukazuje ako pomocou menných priestorov zamedziť kolízii v názvoch elementov:

V dokumente sa vyskytuje dvakrát element tabulka, no vždy je priradený inému mennému priestoru.
XPath
Xpath (XML Path Language) vo verzii 1.0 definuje organizáciou W3C schválenú syntax popisu adries častí XML dokumentu. XPath výrazy sa vyhodnotia podľa logického stromu dokumentu a tak sa nájdu odpovedajúce uzly ( elementy, atribúty, text atd.). Spomínaná úroveň abstrakcie chráni vývojára pred zložitosťou fyzickej štruktúry dokumentu a výrazne zjednodušuje prácu.
XPath definuje stromový model podľa ktorého sa vyhodnocujú všetky výrazy. Tento model zodpovedá logickej štruktúre XML dokumentu, ktorá je formálne definovaná ako XML Infoset (XML Information set). Obrázok 1.2 ilustruje stromový model XPath

Väčšina XPath výrazov popisuje množinu uzlov stromu. Napríklad nasledujúcemu výrazu zodpovedajú 2 elementy cena: /faktura/predmet/cena. Tomuto typu výrazu sa hovorí cesta (location path). XPath cesty vyzerajú podobne ako cesty v súborovom systéme, akurát navigujú v rámci stromového modelu, kde identifikujú množinu uzlov(node-set).
XPath je abstraktný jazyk, preto môže byť implementovaný v mnohých rôznych prostrediach. Intenzívne sa používa pri XSL transformáciách (XSLT) k identifikácii uzlov vstupného dokumentu. Taktiež sa používa vo väčšine implementácií štandardu DOM, kvôli bohatším možnostiam vyhľadávania v dokumente. XPath sa dokonca využíva v niektorých moderných technológiách pre sprístupnenie dát, aby sa úložisko dát prezentovalo užívateľovi ako XML. Treba si uvedomiť že XPath výrazy iba definujú ako prechádzať logickou XML štruktúrou a nachádzať odpovedajúcu množinu uzlov, odkiaľ sa však táto logická štruktúra zoberie, to už záleží iba na implementácii.
XPath prechádza strom uzlov v poradí dokumentu(document order). Poradie dokumentu je poradie v ktorom by sa uzly nachádzali v serializovanom XML dokumente(uzly sa prechádzajú zhora dole, z ľava do prava).
Spolu s množinami uzlov, podporuje XPath ešte ďalšie tri dátové typy: logické hodnoty(Boolean), čísla(number) a textové reťazce(string). XPath definuje, ako sa množiny uzlov porovnávajú s každým z týchto typov a ako sa vynúti potrebný dátový typ.
Dátový typ | Popis |
Množina uzlov (node-set) | Množina uzlov bez násobného výskytu |
Logická hodnota | True (Pravda) alebo False (nepravda) |
Číslo(number) | Číslo s plávajúcou desatinnou čiarkou |
Textový reťazec | Postupnosť UCS znakov |
Každý XPath výraz vráti objekt jedného z možných typov. Konkrétny typ tohto objektu je možné vynútiť použitím odpovedajúcej funkcie boolean( ), number( ), alebo string( ). Ak je to potrebné vykoná sa implicitná konverzia objektu na iný dátový typ (napr. ak sa predáva množina uzlov funkcii, ktorá očakáva parameter typu textový reťazec). K porovnaniu a prevodu medzi množinami uzlov a ostatnými dátovými typmi je potrebné uzly zo stromového modelu previesť späť na textový reťazec. XPath definuje, ako v tomto prípade odpovedajúcu reťazcovú hodnotu (string value) získať. Prevádzaním uzlov späť na textové reťazce uľahčuje ich prevod na iné dátové typy a vzájomné porovnávanie medzi rôznymi typmi. Taktiež umožňuje tvorbu veľkého množstva ďalších výrazov.
Nasledujúca tabuľka zhrňuje typy výrazov podporovaných štandardom XPath. Operátory ktoré sa používajú k tvorbe výrazov sú uvedené od najmenej dôležitých po operátory s najvyššou prioritou. Ku kontrole prednosti operátorov je možné použiť zátvorky.
Typ výrazu | Operátory |
Cesta | |
Logický výraz | or, and |
Rovnosť | =, != |
Relácie | <=, <, >=, > |
Číselný výraz | +, -, div, mod, *, -(unárne) |
Atribút | @ |
XPath sa uplatní všade tam, kde je potrebné vyberať z XML dokumentu len určité elementy, na základe vopred daných kritérií. Na XPath sú založené technológie ako XSLT a XQuery.
XSLT
Dokument vo formáte XML prináša vo všeobecnosti formu, v ktorej je možné uložiť informácie rôzneho charakteru. Čo však v prípade, že forma nie je pre aktuálnu potrebu práve najvhodnejšia? Iste, XML parser nie je problém a stačí už len zapísať výsledok podľa potrebnej štruktúry. XSLT je práve o tom, ako to urobiť elegantne a efektívne. Samotný štandard eXtensible Stylesheet Language Transformations, akceptovaný konzorciom W3C, má predchodcu Extensible Stylesheet Language (XSL). Z pohľadu programátora tento „programovací jazyk transformácií“ XML údajov je, opäť a znova XML dokumentom, štruktúrou xsl tagov.
Podporuje:
- Flexibilné dátové typy: boolean, number, string, node-set
- Množinu operácií: <xsl:template>, <xsl:apply-templates>, <xsl:sort>, …
- Vetvenia a cykly: <xsl:if>, <xsl:choose>, <xsl:for-each>, ...
Jednoduchú, ale kompletnú transformáciu dokumentu si ukážeme na príklade „Hello World“. Na začiatku je zdrojový súbor pozdrav.xml:
Dokument obsahuje okrem povinných častí procesnú inštrukciu,:
<?xml-stylesheet type="text/xsl" href="pozdrav.xsl"?>
ktorá definuje odkaz na transformačný súbor pozdrav.xsl. Ten obsahuje jednoduchú kostru a xsl inštrukcie pre transformáciu zdrojového súboru do HTML dokumentu.
Výsledkom transformácie je kód jednoduchej HTML stránky:
Prvá použitá xsl inštrukcia definuje menný priestor týchto inštrukcií. <xsl:stylesheet xmlns:xsl=http://www.w3.org/1999/XSL/Transform version="1.0">
Samozrejme, je možné doplniť aj ďalšie, momentálne sa ale obmedzíme na štandard W3C konzorcia. Jadro prevodu stojí na inštrukcii <xsl:template match="/pozdrav">. Tá, zjednodušene povedané, definuje šablónu na prevod. Do výsledného dokumentu sa vloží len to, čo je obsiahnuté v rámci šablóny vzťahujúcej sa na koreňový uzol zdrojového súboru. V našom prípade to ale znamená aj informáciu, od koho pochádza pozdrav. Docielili sme to inštrukciou <xsl:apply-templates select="od-koho"/>, ktorá v mieste svojho volania aplikuje našu druhú definovanú šablónu. Tento jednoduchý spôsob vnárania je synonymom volania procedúr a funkcií. Poslednou inštrukciou je <xsl:value-of> vkladajúca hodnotu uzla definovaného v atribúte select do miesta svojho volania. Bodka je pritom ekvivalentom názvu uzla, v ktorom je inštrukcia volaná.
Tento príklad vystihuje dôležitú vlastnosť XSLT transformácií - je deklaratívna a založená na pravidlách. Pravidlá sa nazývajú šablóny. Sú to inštrukcie definujúce spôsob prenosu zdrojového elementu do výsledného dokumentu. Pre kompletnú transformáciu musia byť aplikované všetky šablóny. Sú však nezávislé jedna od druhej, a tak poradie spracovania nie je dôležité. V tomto bode je XSLT výrazne odlišné od procedurálneho programovania. Zo zápisu je zrejmé, že ak by sa v xml dokumente vyskytovali nejaké atribúty elementov, pri transformácii sa stratia. Toto sa dá vyriešiť pomocou XPath. Znak @ definuje odkaz na atribút uzla. Inštrukcia <xsl:value-of select=”@meno”/> použije hodnotu Peter z uzla <osoba meno=”Peter”/>. Ak chcem atribúty aj vo výslednom dokumente, zápis:
<uzol atribut=<xsl:value-of select=”.”/>/>
odmietne spracovať akýkoľvek XML parser. XSLT používa konštrukciu:
<xsl:attribute name=”meno_atribútu”>hodnota_atribútu</xsl:attribute>
Príklady vetvenia a cyklov v XSLT:
IF
SWITCH, SELECT, a podobne
FOR EACH