
## Zadani ##

(pocty bodu za kazdou otazku jsou uvedeny v hranatych zavorkach za znenim otazky)

<b>1.</b> Oznacte spravne odpovedi. \[1]
:(a) XPath 2.0 je podmnozinou XQuery 1.0

:(b) XPath sdili jen cast vyrazovych prostredku s XQuery
:(c) XQuery umoznuje uzivateli deklarovat funkce

:(d) XQuery bylo mineno jako nahrada XSLT

<b>2.</b> Jmenujte alespon 4 prvky jazyka XML schema, ktere umoznuji propojit XML schema s jinym XML schematem. \[2]

<b>3.</b> Uvazujte schema podobne jako je na obrazku 1 a popiste slovne vyznam nasledujicich XPath vyrazu. Pro usnadneni nepouzivejte terminy jako uzel ci element, ale spise khiha, nadpis atd. \[4]
:(a) //kniha/nadpis

:(b) //kniha/*/sekce\[2]
:(c) kapitola\[nadpis]

<b>4.</b> Zaskrtnete to, co je v soulady s pravidly XSLT. \[1]

:(a) 
    <xsl:template match = "ahoj" >

      akce
    </xsl:template>

:(b) 

    <xsl:template if test="podminka">
      akce

    else
      jina akce

    </xsl:template>

:(c)
    <xsl:template when test="podminka">

      akce
    </xsl:template>

<b>5.</b> Pro dany XML dokument nakreslete strom a demonstrujte ohodnoceni jeho uzlu podle algoritmu structure-centered mapping. Vysvetlete vyhody a nevyhody tohoto algoritmu. \[3]

    <osoba>

        <jmeno>
            <krestni>Karel</krestni>

            <prijmeni>Nemec</prijmeni>
        </jmeno>

        <email>karel.nemec@comp.cz</email>
    </osoba>

<b>6.</b> Element <kniha> neni korenovy element, ale pouze soucast nejake hierarchicke struktury dokumentu "kniha.xml". Kazda kniha ma pouze jednoho autora, atribut email u elementu autor je nepovinny. Aktualni kontextovy uzel je rodic elementu kniha, ktery je zobrazen na obrazku 1.

![Prg036_pisemka_2007-06-05-kniha.png](Archiv/PRG036 pisemka 2007-06-05/Prg036 pisemka 2007-06-05-kniha.png)

Napise XPath dotaz:

D1. Predchazejici uzly pred nadpisem 1.kapitoly elementu kniha. Vysledek vyznacte take v obrazku. \[2]

<b>7.</b> D2. Napiste dotaz v jazyce XQuery ktery vrati pro kazdeho autora jeho jmeno v elementu <jmeno>, jeho email v elementu <email>. Tyto udaje se ve vysledku budou nachazet v elementu <autor> a cely vysledek bude vlozen v elementu <autori>. \[3]

<b>8.</b> D3. Uvazujte stejny dotaz v XQuery jako v D2 pouze s tim rozdilem, ze pokud autor nema email pak v elementu <email> uvedte text "Nema emailovou adresu". \[3]

## Spravne odpovedi ##

Tyto odpovedi byly uznany v pisemce jako spravne:

<b>1.</b> Spravne je (a) a (c).

<b>2.</b> 4 pozadovane prvky jsou napr. include, import, redefine, any.

<b>3.</b>

:: (a) kazdy nadpis kazde kapitoly, avsak pouze takovy nadpis, ktery je primym synem kapitoly
:: (b) kazda druha sekce takova, ze jako prarodice ma element kniha
:: (c) kapitola, ktera ma nadpis. Zde je vsak potreba zminit, ze zalezi na aktualnim kontextkovem uzlu, ve kterem se prave nachazime.

<b>4.</b> Spravne je pouze (a).

<b>5.</b> (Odpoved lze najit ve slidech s nazvem "Vztah XML databází k jiným databázovým systémům")

:: Vyhody: Pro kazde dva elementy lze urcit jejich vzajemny vztah - jestli jeden je podelementem druheho ci naopak.
:: Nevyhody: Fakticky nelze snadno aktualizovat. Pri aktualizaci je zapotrebi cely strom precislovat.
:: Strom je zobrazen na nasledujicim obrazku. Ohodnoceni uzlu je dvojice hodnot, kde ta prvni odpovida preorder pruchodu stromem a druha postorder pruchodu.

![XML-05-06-2007-osoba.png](Archiv/PRG036 pisemka 2007-06-05/XML-05-06-2007-osoba.png)

<b>6.</b> kniha/kapitola\[1]/nadpis/preceding::*
![Prg036_pisemka_2007-06-05-kniha2.png](Archiv/PRG036 pisemka 2007-06-05/Prg036 pisemka 2007-06-05-kniha2.png)

<b>7.</b> 

    <autori>

      {
        for $kniha = doc("kniha.xml")//kniha

        return
            <autor>

                <jmeno>{ $kniha/autor/text() }</jmeno>
                <email>{ $kniha/@email }</email>

            </autor>
      }

    </autori>

<b>8.</b> 

    <autori>
      {

        for $kniha = doc("kniha.xml")//kniha
        let $email := $kniha/@email

        return
            <autor>

                <jmeno>{ $kniha/autor/text() }</jmeno>
                {

                    if (exists($email))
                    then <email>{ $email }</email>

                    else <email>Nema emailovou adresu</email>
                }

            </autor>
      }

    </autori>

## Bodovani ##

Celkem bylo mozne ziskat 21 bodu, znamkovaci stupnice byla nasledujici:

:: 19 - 21 → 1
:: 18 - 17 → 2
:: 16 - 15 → 3
:: jinak za 4
