Both sides previous revision
Poprzednia wersja
Nowa wersja
|
Poprzednia wersja
|
pl:miw:miw2008_xtt_xmlpro [2008/06/09 18:37] miw |
pl:miw:miw2008_xtt_xmlpro [2019/06/27 15:50] (aktualna) |
====== Opis ====== | ====== Opis ====== |
| __**Projekt zakończony**__ |
| |
Maksymilian Imioło <maximiolo@o2.pl> | Maksymilian Imioło <maximiolo@o2.pl> |
| |
Translacja XTTML do innych formatów z użyciem Prologu. | Translacja XTTML do innych formatów z użyciem Prologu. |
| |
====== Spotkania ====== | |
===== 08.03.04 ===== | |
* parsowanie xml w prologu | |
* obsługa XSD w prologu | |
* poczytac: graphviz, RIF | |
| |
| |
| |
===== 080318 ===== | |
* poczytać... | |
| |
===== 080408 ===== | |
* translacja [[hekate:hekate_markup_language|HML/ARDML]] (produkowanego przez [[hekate:VARDA]]) | |
* przykład z [[hekate:hekate_case_thermostat]] therm jako p. odn. | |
* podejście: | |
- mamy plik ARDML z Vardy (axg.) | |
- parsujemy go w prologu | |
- generujemy bazę wiedzy prologową dla VARDA (ard_att/1, ard_property/1, ard_depend/2, ard_hist/2) (assert(ard_att('Thermostat'))) (czyli to, co dostaniemy po listing(ard_depend),listing(ard_attribute),listing(ard_property),listing(ard_hist).) | |
- generujemy odpowiadający mu plik DOT | |
| |
http://www.swi-prolog.org/packages/sgml2pl.html | ====== Spotkania====== |
load_xml_file(+File, -ListOfContent) | |
| [[pl:miw:miw2008_xtt_xmlpro:spotkania|Spotkania]] |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
np: | |
<att name="Thermostat"/> -> assert(ard_att('Thermostat')). | |
| |
| |
| |
===== 080415 ===== | |
* parsowanie listy | |
| |
===== 080422 ===== | |
* generowanie prologu | |
| |
| |
| |
| |
===== 080603 ===== | |
* testy kodu dla varda, po ang, upload do wiki | |
* [[pl:miw:miw08_xtt_rif|XTT i RIF]] | |
===== 080610 ===== | |
* sprawozd | |
| |
====== Projekt ====== | ====== Projekt ====== |
| |
Plik do parsowania: {{:pl:miw:ard-vardy.xml|:pl:miw:ard-vardy.xml}} | Plik do parsowania: {{:pl:miw:ard-vardy.xml|:pl:miw:ard-vardy.xml}} |
| |
| |
| |
| |
| |
| |
| |
| |
| |
Translator można uruchomić na kilka sposobów: | Translator można uruchomić na kilka sposobów: |
1 | ===1=== |
Załadować plik źródłowy i wpisać : translate('Source.xml','Destination.xml'). | Załadować plik źródłowy i wpisać : translate('Source.xml','Destination.xml'). |
Otrzymamy wydruk na ekranie monitora oraz, zapis do wskazanego pliku. | Otrzymamy wydruk na ekranie monitora oraz, zapis do wskazanego pliku. |
2 | ===2 === |
Załadować plik źródłowy i wpisać : translate('Source.xml'). | Załadować plik źródłowy i wpisać : translate('Source.xml'). |
Otrzymamy wydruk na ekranie monitora, jeśli będziemy chcieli zapisać do pliku to należy | Otrzymamy wydruk na ekranie monitora, jeśli będziemy chcieli zapisać do pliku to należy |
wpisać: save('Destination.xml'). | wpisać: save('Destination.xml'). |
3 | === 3 === |
Można połączyć translator bezpośrednio z vardą umieszczając odpowiedni wpis w pliku "VARDA.pl", | Można połączyć translator bezpośrednio z vardą umieszczając odpowiedni wpis w pliku "VARDA.pl", |
":-ensure_loaded('varda_pl2xml').", dzięki temu no załadowaniu vardy i wygenerowaniu pliku przy pomocy axg, | ":-ensure_loaded('varda_pl2xml').", dzięki temu no załadowaniu vardy i wygenerowaniu pliku przy pomocy axg, |
Poniżej znajdujesię kod translatora. | Poniżej znajdujesię kod translatora. |
<code prolog> | <code prolog> |
| %%%%%%%%%%%%%%%%%%%%% Load %%%%%%%%%%%%%%%%%%%%%%%%%%%%%% |
| |
%%%%%%%%%%%%%%%%%%%%% Load%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% | |
translate(Source,Dest):- | translate(Source,Dest):- |
load_structure(Source,X,[space(remove),dialect(xml)]),Z=..X,assertz(Z),element(hml,_,A), | load_structure(Source,X,[space(remove),dialect(xml)]), %załadowanie pliku |
checkAtt(A),checkProperty(A),checkHistory(A),checkDepend(A),show,save(Dest). | Z=..X,assertz(Z),element(hml,_,A), %wyciągnięcie elementu hml |
| checkAtt(A), %analiza elementu "attribute_set" |
| checkProperty(A), %analiza elementu "property_set" |
| checkHistory(A), %analiza elementu "tph" |
| checkDepend(A), %analiza elementu "ard" |
| show, % wyświetlenie wyników |
| save(Dest). %zapis wyniku |
| |
translate(Source):- | translate(Source):- |
listing(ard_att),listing(ard_property),listing(ard_hist),listing(ard_depend). | listing(ard_att),listing(ard_property),listing(ard_hist),listing(ard_depend). |
| |
%%%%%%%%%%%%%%%%%%%%%%%%%%% Zapis%%%%%%%%%%%%%%%%%%%%%% | %%%%%%%%%%%%%%%%%%%%%%%%%%% Save to file %%%%%%%%%%%%%%%%%%%%%% |
save(Dest):- | save(Dest):- |
tell(Dest),write('<?xml version="1.0" encoding="utf-8"?>'), | tell(Dest),write('<?xml version="1.0" encoding="utf-8"?>'), |
| |
%%%%%%%%%%%%%%%%%%%%% Attribute_set%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% | %%%%%%%%%%%%%%%%%%%%% Attribute_set%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% |
| |
| |
checkAtt(A):- | checkAtt(A):- |
include(element(attribute_set,_,Li),A), | include(element(attribute_set,_,Li),A), % sprawdzanie istnienia elementu |
leng(Li,Dl1),assert(viewList(_)),showAtt(Li,Dl1,0).%,viewList(Lis),write(List). | leng(Li,Dl1), % wylicznie dlugości listy |
| assert(viewList(_)), % deklarowanie pamięci |
| showAtt(Li,Dl1,0). |
| |
showAtt(L,0,Dl). | |
| showAtt(_,0,_). |
showAtt(L,D1,Dl):- | showAtt(L,D1,Dl):- |
D1>0, | D1>0, |
NewDlu is D1-1, | NewDlu is D1-1, |
deleteOne(Dl,L,element(att,[name=ZX,_,_,_],[])), | deleteOne(Dl,L,element(att,[name=ZX,_,_,_],[])), |
%string_length(ID,LENG), | |
%LEE is LENG-4, | |
assert(memory(ZX)), | assert(memory(ZX)), |
memory(ZX), | memory(ZX), |
%sub_string(ID,4,LEE,_,WY), | assert(ard_att(ZX)), |
assert(ard_att(ZX)),%nalezy(C,W), | |
viewList(LisGlob),add(LisGlob,ZX,LisGlob2), | viewList(LisGlob),add(LisGlob,ZX,LisGlob2), |
retractall(viewList(_)), | retractall(viewList(_)), |
showAtt(L,NewDlu,DlNew). | showAtt(L,NewDlu,DlNew). |
| |
%%%%%%%%%%%%%%%%%%%%% Property_set%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% | %%%%%%%%%%%%%%%%%%%%% Property_set %%%%%%%%%%%%%%%%%%%%%%%%%%%%%% |
checkProperty(A):- | checkProperty(A):- |
include(element(property_set,_,L),A), | include(element(property_set,_,L),A), |
showProp(L,D,0). | showProp(L,D,0). |
| |
showProp(L2,0,Dl2). | showProp(_,0,_). |
showProp(L2,D2,Dl2):- | showProp(L2,D2,Dl2):- |
D2>0, | D2>0, |
showProp(L2,NewDlu2,DlNew2). | showProp(L2,NewDlu2,DlNew2). |
| |
writeProp(0,L,Lista). | writeProp(0,_,_). |
writeProp(CA,[J1|L1],Lel):- | writeProp(CA,[J1|L1],Lel):- |
CA>0, | CA>0, |
viewList(All), | viewList(All), |
NWyj is Wyj+1, | NWyj is Wyj+1, |
showName(All,NWyj,Name).%,write(Name). | showName(All,NWyj,Name). |
| |
showName(All,1,Name):- | showName(All,1,Name):- |
deleteOne(Wyj-1,All,Name). | deleteOne(Wyj-1,All,Name). |
| |
%%%%%%%%%%%%%%%%%%%%% Hist_set%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% | %%%%%%%%%%%%%%%%%%%%% Hist_set %%%%%%%%%%%%%%%%%%%%%%%%%%%%%% |
checkHistory(A):- | checkHistory(A):- |
include(element(tph,_,L1),A), | include(element(tph,_,L1),A), |
leng(L1,D1),showlHist(L1,D1,0). | leng(L1,D1),showlHist(L1,D1,0). |
| |
showlHist(L1,0,Dl). | showlHist(_,0,_). |
showlHist(L1,D1,Dl):- | showlHist(L1,D1,Dl):- |
D1>0, | D1>0, |
showlHist(L1,NewDlu,DlNew). | showlHist(L1,NewDlu,DlNew). |
| |
%%%%%%%%%%%%%% pobrac src i dest%%%%%%%%%% | %%%%%%%%%%%%%% Get src i des t%%%%%%%%%% |
checkHist(Zr,De,Zrod,Dest):- | checkHist(Zr,De,Zrod,Dest):- |
atom_number(Zr,Zrr), | atom_number(Zr,Zrr), |
deleteOne(Position-1,All,Output). | deleteOne(Position-1,All,Output). |
| |
%%%%%%%%%%%%%%%%%%%%% Depend_set%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% | %%%%%%%%%%%%%%%%%%%%% Depend_set %%%%%%%%%%%%%%%%%%%%%%%%%%%%%% |
checkDepend(A):- | checkDepend(A):- |
include(element(ard,_,LisDep),A), | include(element(ard,_,LisDep),A), |
leng(LisDep,DlDep),wyswietlDepe(LisDep,DlDep,0). | leng(LisDep,DlDep),wyswietlDepe(LisDep,DlDep,0). |
| |
wyswietlDepe(L1,0,Dl). | wyswietlDepe(_,0,_). |
wyswietlDepe(L1,D1,Dl):- | wyswietlDepe(L1,D1,Dl):- |
D1>0, | D1>0, |
wyswietlDepe(L1,NewDlu,DlNew). | wyswietlDepe(L1,NewDlu,DlNew). |
| |
%%%%%%%%%%%%%% pobrac independent i dependent%%%%%%%%%%%%%% | %%%%%%%%%%%%%% Get independent i dependent %%%%%%%%%%%%%% |
checkDep(In,De,InOut,DeOut):- | checkDep(In,De,InOut,DeOut):- |
atom_number(In,Inn), | atom_number(In,Inn), |
deleteOne(Position-1,All,Output). | deleteOne(Position-1,All,Output). |
| |
%%%%%%%%%%%%%%%%%%%%%%%%%%% Pozostałe %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% | %%%%%%%%%%%%%%%%%%%%%%%%%%% Others %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% |
| % sprawdzanie istnienia elementów w liście |
include(X,[X|_]). | include(X,[X|_]). |
include(X,[_|Tail]) :- | include(X,[_|Tail]) :- |
include(X,Tail). | include(X,Tail). |
| % obliczanie długości listy |
leng([],0). | leng([],0). |
leng([_|Tail],Dlug) :- | leng([_|Tail],Dlug) :- |
leng(Tail,X), | leng(Tail,X), |
Dlug is X+1. | Dlug is X+1. |
| % wyciąganie konkretnego elementu listy |
deleteOne(0,[F|_],F). | deleteOne(0,[F|_],F). |
deleteOne(Poz,[_|Xx],W):- | deleteOne(Poz,[_|Xx],W):- |
Poz>0, | Poz>0, |
PozNew is Poz-1, | PozNew is Poz-1, |
deleteOne(PozNew,Xx,W). | deleteOne(PozNew,Xx,W). |
| |
| % dodanie do listy |
add([],X,[X]). | add([],X,[X]). |
add([G|O],X,[G|R]):- | add([G|O],X,[G|R]):- |
add(O,X,R). | add(O,X,R). |
| |
| |
| |
| |
{{:pl:miw:varda_pl2xml.pl|Translator}} {{:pl:miw:input.xml|Plik wejściowy}} {{:pl:miw:out.pl|Plik wyjściowy}} | {{:pl:miw:varda_pl2xml.pl|Translator}} {{:pl:miw:input.xml|Plik wejściowy}} {{:pl:miw:out.pl|Plik wyjściowy}} |
| |
| |
| Dla potrzeb wyświetlenia wyników plik wyjściowy został powyżej dołączony z rozszerzeniem pl. |
| |
| |
| |
| |
| |
| |
| |
====Napotkane problemy==== | ====Napotkane problemy==== |
==Usunięcie białych znaków== | ===Usunięcie białych znaków=== |
W pliku mamy znaczniki nowej lini np:('\n','\n ','\n ') bez ich usunięcia nie można dotrzeć do wnętrza pliku. | W pliku mamy znaczniki nowej lini np:('\n','\n ','\n ') bez ich usunięcia nie można dotrzeć do wnętrza pliku. |
Korzystajac z "usun" | Korzystajac z "usun" |
| |
| |
==Sprawdzanie długości stringów== | ===Sprawdzanie długości stringów=== |
W porównaniu z Varda w wersji 0, należało znależć i zastosować odpowiednie predykaty: string_lenht/2 oraz sub_string/4. | W porównaniu z Varda w wersji 0, należało znależć i zastosować odpowiednie predykaty: string_lenht/2 oraz sub_string/4. |
<code prolog> | <code prolog> |
LEEE is L-4, | LEEE is L-4, |
sub_string(Bb,4,LEEE,_,WYJ), | sub_string(Bb,4,LEEE,_,WYJ), |
| </code> |
| ===Rzutowanie z stringa na inta=== |
| <code prolog> |
| atom_number(Zr,Zrr) |
| </code> |
| ===Wyciąganie konkretnego elementu z listy=== |
| Wyciąganie odpowiednich elementów z listy wykonywałem poniższym predykatem. |
| <code prolog> |
| deleteOne(0,[F|_],F). |
| deleteOne(Poz,[_|Xx],W):- |
| Poz>0, |
| PozNew is Poz-1, |
| deleteOne(PozNew,Xx,W). |
| </code> |
| ===Przechowywanie listy w pamięci=== |
| W pamięciu przechowwane sa wszystkie atrybuty. |
| <code prolog> |
| writeProp(CA,C,[]),memoryList(Lista),assert(ard_property(Lista)), |
| view(ListaGlob),add(ListaGlob,Lista,ListaGlob2), |
| retractall(view(_)), |
| assert(view(ListaGlob2)), |
| retractall(memoryList(_)), |
| </code> |
| ===Podczas kompilacji=== |
| Podczas kompilacji otrzymuję komunikat, który jednak nie ma wpływu na otrzymany wynik translacji. |
| <code prolog> |
| ERROR: SGML2PL(xml): input.xml:2: file ".\hml.dtd" does not exist |
| </code> |
| Błąd ten dotyczy linijki, która pojawiła sie w wersji 1 Vardy. |
| <code prolog> |
| <!DOCTYPE hml SYSTEM "hml.dtd"> |
| |
</code> | </code> |
| |