XML generation next ------------------- Nove XML v ramci CBS bude fungovat na zakladnich castech: - editace struktury XML (DTD XML) + validace pri udpatovani - plnohodnotne preklady XML + zajisteni stejnosti struktur dokumentu - dalsi se sem dopise pustupne.... DTD XML ------- DTD pro XML se edituji v DATA modulu, jak by clovek cekal. Tato cast obsahuje nasledujici: - struktura XML DTD - entity - transformace struktura XML DTD ----------------- Kazda struktura muze byt nejakeho typu. Aktualne podporujeme nasledujici typy: 1. validni XML zde se netestuje zadna struktura, jen se testuje dokument, zda-li je validni dle XML vrele nedoporucuji pozivat pro dokuemtny, jejiz forma je znama !!! dejte si tu praci a nadefinujte si struktru, nebo se z toho casem po.... 2. XML scheme struktura se edituje jako 'XML scheme' coz je W3C standard, vice w3c.org a pripadne nejake XML suite aplikace. Zadava se jako 'XML' dokument (ano, XML popisuje strukturu XML). Dokonce existuje DTD pro toto XML ktere popisuje DTD 3. nativni struktura struktura je definovana nativne v ramci CBS, ktere s ni pak umi nakladat. Dalsi popis se tyka vyhradne teto struktury XML DTD struktura je slozena z ELEMENTU. Tento element odpovida fyzickym elementum v XML dokumentu. Kazdy element ma: - jmeno povolene jsou pouza validni znaky pro elementy A-Z a-z 0-9 - : _ je to to co se zadava d XML dokuemntu pozor na CaSe sensitive - doporucuji vse malima pismenama - atributy zdavaji se v ramci elementu ala detajly pozdeji - typ typ elementy - urcuje, jak se naklada s 'child' elementama tohoto elementu - vzdy se operuje s primim potomkem, neni mozne definovat strukuru do 'hloubky' v ramci JEDNOHO elementu, vzdy kazdy element obsahuje strukturu pro SVE primo potomky empty: zadne child nejsou povoleny - element je ala nebo pravdepodobne budou pouzity atributy jako nosic dalsich informaci any: jakykoliv element ze struktury se muze vyskytovat jako potomek. Je mineno JAKYKOLIV element z aktualni 'XML' struktury. Element musi samozrejmne dodrzovat dalsi pravidla pro sebe same (atribyty, potomky, ...) PCDATA: 'parseable char data' - proste 'text' bez ladu a skladu. Pokud se v obsahu elementu vyskytne jiny element -> chyba PCDATA with content type: dtto jako 'PCDATA' jen s tim rozdilem, ze CBS kontroluje i obsah jesli je validni pry vybrany typ (set, selekt, data souce, ... cokoliv). Toto je rozsireni XML DTD a v priapde generovani validniho DTD bude vygenerovano pouze PCDATA. V pripade uploadu je ale telo nadale kontrolovano na validitu (tedy linku, etc.) pokud mame datovy typ 'key' pak muzeme mit 123 a CBS pri uploadu kontroluje, zda-li je 123 platny produkt Ne vsechny datove typy zde maji smysl - napriklad 'textarea' a dalsi. Myslet pri voleni typu. mixed: obsah elementu je PCDATA a 'dalsi' elementy. Tato volba MA z normy vlasnost, ze elementy a 'PCDATA' jsou ve vztahu NEBO a vse je volitelne. Cili, edituje se pouze vyber zucastnenych elementu. Jako child se pak muze vyskytnout jakykoliv element z vybranych nebo text. V jakemkoliv poradi. Telo muze byt take prazdne. normal: child elementy jsou definovany pomoci modelovich skupin (viz nize) role - role elementy v systemu (az budeme potrebovat rozsiri se, ve strukturach to jiz je) kazdy modul muze 'exportovat' nejake role, diky kterym je pak shcopny pracovat nad neznamym DTD. Napriklad muzeme vytvorit tag 'private' a priradit mu patricnou systemovou roli a tento tag pak bude filtrovan dle ACL Kazdy element muze obsahovat atributy. Atribut obsahuje: name - jmeno - pouziva se v XML dokumentu typ - typ atributu optional: atribut NENI vyzadovan, ale muze se uvest required: atribut JE vyzadovan a MUSI se uvest. default hodnota neni logicky k dispozici implied: atribut NENI vyzadovan, ale muze se uvest. Pokud neni uveden, je pouzita 'default value'. Neni mozne zjistit, zda-li atribut byl anspat rucne, nebo se hodnota vzala z default value fixed: atribut nabyve pouze hodnoty 'default value' a neni mozne ho zmenit. Je tak mozne umistovat do dokuemtn atributy, ktere tam budou, ikdyz je tam nikdo nenapise a autor ma jistotu, ze tam takovy atribut bude (napriklad verze, revize, ...) value_type - typ hodnoty v ramci CBS, na ktery se kontroluje atribut. Ne vsechny maji smysl. Toto je rozsireni CBS a ne vsechny CBS datove typy maji protejsek v XML. Tedy pri generovani DTD byde CBS typ zkonvertovan na 'obdobny' ve standardu. Pri uploadu se samozejmne kontroluje vse. Je mozne tedy udelat: .... a 'id' se bude kontrolovat v tabulce (existence) Ne vsechny typy zde maji smysl. Ja nutne si uvedomit, ze nektere typy maji v CBS 'alias' a 'jmeno' (naprikald select/set). V XML dokumentu se zadavaji vzdy 'aliasy'. Jmeno muze slouzit pro napovedu a pdoobne, pri psani v dhtml editoru (az jesli nekkdy) value_attribs - atributy dle typu, stare zname. Ty vizualni (napriklad length u textu a pod) nemaji v zasade zadny valny vyznam. Nicmene, vetsina (maximalni delka, tabulky u datovych zdroju a pod.) maji vyznam, kotnroluji se a ovlivnuji 'value_type' (obsahove) role - role elementy v systemu (az budeme potrebovat rozsiri se, ve strukturach to jiz je) kazdy modul muze 'exportovat' nejake role, diky kterym je pak shcopny pracovat nad neznamym DTD. Napriklad muzeme vytvorit atribut 'private' a priradit mu patricnou systemovou roli a tag, obsahujici tento atribut, pak bude filtrovan dle ACL (vcetne svych childu) Modelove skupiny ---------------- Kazdy element muze kontrolovat sve prime potomky. Jejich typ, poradi, pocet. Modelova skupina se sklada z elementu a druhu vazby. Vazba muze byt: sequence - elementy jsou vyzadovany presne v poradu v jakem jsou napsany choiuce - pouze 'jeden' z uvedenych elementu je vyzadovan Referuji zde elementy, ale misto elementu se muze pouzit vnorena modelova skupina. Na element ci skupinu se da aplikovat volba kontroly poctu. Pokud neni uvedeno nic, tak se element/skupina musi vyskytovat prave jednou (1x). Dalsi mmoznosti jsou: ? - muze ale nemusi se vystkytnout (cili muze byt 0x nebo 1x) + - musi se vyskytnou alespon 1x ci vice (1x 2x 3x ....) * - muze ale nemusi se vysytnout v jakemkoliv poctu (0x 1x 2x 3x) * je defacto ekvivalent +? - ale to neni validni zapis Modelova skupina se uzavira do ( ) Elementy se pisou jako elementy (textove). Sequence se oznacuje pomoci | (takvoa ta roura) a choice pomoci , (carka) V ramci jedne modelove skupiny se muze (musi) vyskytnou JEDEN druh vazby (sequnce/choice) Priklady: x - musi nasledovat element x a to prave 1x x+ - musi nasledovat 1 nebo vice opakovani elementy x x | y+ - jeden x nasledovani alespon jednim (a vice) y (x,y)+ - xy xy xy xy .... (x?,y,z)+ - xyz nebo yz a to cele se opakuje 1x a vice (x,(y | z))+ - zy nebo xz s opakovanim ... Pozor na nejednoznacne zapisy. (x,y) | (x,z) Pokud se napise parser/validator BUDE generovat chybu ---> nevi, jakou zavorku si ma vybrat, protoze 'x' pada do obou. Parse NEBUDE koukat dopredu. Na to pozor !!! Spravny zapis je tedy: x , (y | z) Modelove skupiny PLNE respekuji normu. Pri update se kontroluje validita a pouziti existujiich elementu. Vizualni modelovani ------------------- Protoze regualrni vyraz pouzity ve skupinach neni jiste pro mnohe dobre citelny, tak jsem spachal minimalisticky vizualni editor na XML DTD skupiny. Ted vas odprosti od nutnosti psat ty veci rucne a nektere urpavy je i rychlejsi nez editovani. Je urcet lavne pro zprehledneni. Da se psat i rucne a pak vizualni cast pozuivat jen pro kontorlu. Zalezi na gustu a na tom, jesli si chete dokazat, ze 'na to mate' to psat rucne :) Nekteri pouzivaji vizualni veci na vsechno, jini ne. Cili, volba je na vas. Veskera editace (VE) se do DB neuklada az do doby, kdy se da update. VE je pouzitelna az od 2 elementu a vise. Pokud mate 'jeden' element, napiste si rucne (element) A je to. Jeslize zacina na 'ciste' louce, VE editor udela 'empty_model' element. Tento element je potreba nahradit nejakym validnim. Tento element nejde ani smazat. Dokud nesahnete na VE lze plne editovat model rucne. VE vzdy udrzuje textovy model a vizualni v synchronizaci. Je mozne z VE ihned udelat upravu na modelu rucne a zaroven vidite co VE dela. Jeslize tedy zacinate, nebo mate jeden element, prvni co musite udelat je nejaka skupina (viz add sequence/group). Editor funguje drag & drop, tedy click na necem a pretahnout nekam a pustit mys. VE dava najevo, jesli se mu dana pozice libi nebo ne (zeleny/cerveny text). Editor ma '3' casti: 1. elementy 2. prikazy 3. model Model zobrazuje elementy jako text, opakovani jako +?* u elementu/skupiny. Choice je zobrazovan jako | | | element1 | | elem2 | | element3 | | | | je oznaceni skupiny (levo zacatek pravo konec) - v barve svetle sede Sequence Choice je zobrazovan jako | | | element1 ---- elem2 ---- element3 | | | | je oznaceni skupiny (levo zacatek pravo konec) - v barve cerne VE umoznuje drag & drop z elementu, prikazu a modelu. V modelu je mozne d&d element nebo skupinu. Pri nekterych oepraci se chovani lisi podle toho, jesli je skupina d&d za zacatek, nebo konec. Skupiny jsou 2 pixly siroke, tedy se na ne hure najizdi, takze doporucuji nekonzumovat alkohol pred delanim DTD. Predpokladam, ze axl trochu me 'super' HTML upravy, aby bylo lepsi pro praci. Potom se uz bude moc chlastat imprvere. Detajly: V [3] je mozne pretahovat element na jiny element. Pokud tak udelate, elementy se prohodi. Element lze takto pretahnout i do JINE skupiny - pokud se da na zacatek, presune se jako prvni. Pokud na konec, tak jako posledni. Elementy je mozno pridavat - proste se z [1] vezme element a pretahne se na [3]. Pokud se pretahne na element, vlozi se PRED tento element. Pokud na skupinu, tak se vlozi bud na zacatek nebo na konec, podle toho jesli se pretahne na zacatek/konec skupiny (leve pravo) Prikazy se provadi tak, ze se v [2] chytne prikaz a pretahne se na misto urcteni v [3]. Priakzy jsou provadeny ihned, ale jak jiz bylo zmineno, zmeny jsou ulozeny do DB az po update, cili, v pripade problemu, staci stisk back tlacitka v prohlizeci nebo proste se vratit Popis prikazu delete smaze element/skupinu disjoin group zrusi skupinu, ale elementu necha - presude do nadrazene skupiny add sequence prida sequency - pokud se prida NA item, tak tento item se do teto skupiny presune. Pokud se prida na jinou skupinu, prida se na zacatek/konec, dle ciloveho presunuti. System pridava elementy 'new_element' - tyto elementy je potreba zmenit na nejake validni - napriklad tak, ze sem element pridate a tento zrusite. add choice stejne jako sequence, ale pridava choice set to sequence set to choice zmeni grupu na patricny typ - lze aplikovat jen na grupu set requried set optional set 1+ repeat set 0+ repeat nastavy opakovani elementu/grupy na prislusny pocet (ciz vise) move to previous move to next move to first move to last presune item/skupinu na prislusnou pozici, v ramci skupiny (snad neni potreba komentar) Jeslize se vam stane, ze ve skupine zustane JEDEN item, tak se cela skupina zrusi i cela skupina (defacto disjoin group). Je to protoze neni mozne detekovat jesli skupina je choice/sequence, pokud je zde pouze jeden item (neni zadne | nebo ,). CBS obsahuje 'minimalizator', vzdy vytvari nejjednodusi zapis. Ikdyz rucne napisete (a) | (b) tak se z toho stane (a | b) VE muze mit nejakou botu. Ta se projevy tim, ze VE ukaze blbosti, uvidite spoustu chyb, misto elementy (nevo celeho modelu) se objevy "Array" a pod. Pokud se tak stane, tak prosim o: 1. back v IE 2. zkopirujte textovej model do majlu (z edit pole) 3. napiste 'akci' kterou jste provedli 4. napiste jaky XML/element to dela Vseho to zabalte, pribalte 1000kcs a poslete mi to postou. Ja to opravim. Zatim vse, dokuemtn budu postupne urpavovat, dle dotazu, nejasnosti, ... Dokument lze nalest na CVS whiskey : Tools\Server\Cbs\Docs\BigBugXml.txt CVS je pristupne i prez WWW, takze je mozno sledovat revize, zmeny a necist vzdy celi dokument. XML support v ramci TPL ----------------------- xml.create name xml_body vytvore XML strom pojmenovany 'name' z 'xml_body', xml_body MUSI byt validni, jinak se generje warning xml.free uvolni XML strom a pamet je k dispozici pro dalsi uziti Pokud prikaz vyzaduje parametr xml, pak je minen prave XML strom. Pokid prikaz vyzaduje parametr element, pak je mieno jmeno elementu Pozor - XML je _CaSe_ sensitive. XML kontextove zavisle prikazy ------------------------------ Nasledujici prikazy jsou kontextove zavisle a funguje jen pri prochazeni stromu, transforamci a podobne. Pokud budou pouzity mimo tento kontext, generuji warning. Po pocitani/testovani elementu, se pocita od 0 a ignoruje se aktualni element (nezapocitava se) xml.elemNest xml element typ pocita pocet vyskytu elementu. Typ je nepovinny paramtr. Pokud schazi, pak je pouzito 'parents'. Vyznam parametru typ: parents - pocita vyskyt tagu i vsech parentu az do rootu prevsiblings - vyskyt elementu ve vsech elementech pred aktualnim, vcetne jeho nadrazenych prevs - vyskyt elementu pred aktualnim (pouze v aktualnim levelu) xml.elemExists xml element typ vraci 0 ci 1 v zavislosti na tom, zda se dany element vyskutuje v zadanem miste. Typ je nepovinny, pokud neni zadan, je brano 'childs'. Vyznam parametru typ: childs - vsechny child elementy parent - parent elementu parents - jakykoliv z rodicovskych (vsech) elementu prevsiblings - vsechny predchozi elementy vcetne nadrazenych nexts - vsechny nasledujici elementy v aktualni urovni prevs - vsechny predchozi elementy v aktualni urovni level - vsechny elementy (vyjma aktualniho) v aktualni urovni xml.elemChildType xml vraci 'typ' child elementu: none - zadny child combined - text+elementy text - pouze textove elementy element - elementy Prikaz testuje vsechny child elementy daneho elementu xml.elemValue xml vraci 'value' elementu. Value elementu je dostupna pouze pro elementy typu text. Priklad: Toto je value elementu xml.elemExecute xml zpracuje child elementy. Prikaz ma vyznam jen pokud se child elementy nezpracovavaji automaticky (napr. pri transforamcnim pravidle s kombinaci flagu own_childs). Pokud se prikaz vola ikdyz jsou childy zpracovavany 2x, budou na vystup predany take 2x. xml.attrValue xml attr_name vrati hodnotu atributu z elementu xml.attrExists xml atr_name vrati 0 ci 1 v zavislosti na tom, ma-li dany element atribut 'attr_name' XML transformace ---------------- Tranforamce funguje tak, ze je postupne prochazen cely XML strom. Pro kazdy tag se hleda transforamcni pavidlo, ktera se sdruzuji to skupin (tj. transformace). Pravidla jsou prohledava PRESNE v tom poradi, v jakem jsou registrovana, pokud se nezavola nejaky prikaz na jejich preskupeni. Kazde pravidlo na condition, ktere dale urcuje zda je pravidlo v dany okamzik platne ci nikoliv. Jeho vyhodnocovani se provadi u kazdeho tagu. Pokud je pravidlo shledano validnim, tak se provede 'body' pravidla. Po te se provedou veskere transformace child elementu, Pokud si pravidlo natsavilo flag 'own_childs' tak se automaticky neprovadi child elementy a je na pravidle, jak s nimi naloze. Pro provede body a pripadne child elementu se vola bodyclose. Textove elementy (napr. toto je textovy element) se pouze primo prodavaji na vystup. Pokud se pro dany element nenajde zadne pravidlo, element se z vystupu bezezbytku a vcetne svych childu odstrani. xml.transformCreate xlt vytvori transformaci pojmenovanou 'xlt' xml.transformRuleAdd xlt element flags condition body bodyclose prida pravidlo do 'xlt' transformace element - jmeno elementu (JEDNOHO) flags - flagy pravidla, carkou odeleny seznam own_childs - pravidlo samo zpracovava sve childy condition - expression pro vyhodnoceni - pravidlo je platne pouze pokud je expression nenulovy body - TLP kod namisto open tagu bodyclose - TPL kod namisto closing tagu xml.transform xml xlt provede tranforamce nad stromem xml a pravidly xlt, vysledej je vystup prikazu