/*
построение описания УДК в иерархическом формате
*/
main(X) :-
F = readXML("ql"+X+".xml"),
ch := eXElem(F, "//item"),
List=makeItemList(^ch),
doubleVec := newVector([]),
Vector = newVector([]),
insert(List, Vector),
write("-----------------"),
XXX = printTree(enum(Vector), ""+X),
writeXML("tree"+X+".xml", _XXX;, "w");
makeItemList(DocEnum) :- exhausted(DocEnum), []
;
makeItemList(DocEnum) :-
Item = eValue(DocEnum),
[Item|makeItemList(eNext(DocEnum))]
;
insert([CurItem|Rest], Vector) :- !,
ID = sNorm(getXText(CurItem, "//identifier")),
VectorToInsert = checkNodes(ID, enum(Vector), Vector), !,
vAdd(VectorToInsert, [ID, CurItem, newVector([])]),
write("."),
insert(Rest, Vector)
;
insert([], Vector) :- !, Vector
;
refsToList(Enum) :- exhausted(Enum), !, [];
refsToList(Enum) :-
R = eValue(Enum), !,
[R | refsToList(eNext(Enum))];
checkNodes(_, VecEnum, Vec) :- exhausted(VecEnum), !, Vec
;
checkNodes(ID, VecEnum, _) :-
ItemNode = eValue(VecEnum),
Ch = checkNode(ID, ItemNode), !,
(
Ch=0, !, ^doubleVec /* элемент уже имеется */
##
SubVec = getSubVec(ItemNode),
checkNodes(ID, enum(SubVec), SubVec)
)
;
checkNodes(CurStr, VecEnum, Vec) :-
checkNodes(CurStr, eNext(VecEnum), Vec)
;
checkNode(CurStr, [CurStr | _]) :- !, 0
;
checkNode(CurStr, [NodeStr | _]) :-
startsWith(CurStr, NodeStr, 0), 1
;
getSubVec([_, _, SubVec]) :- SubVec;
printTree([ID, CurItem, Vec], Super) :- !,
Title = sNorm(getXText(CurItem, "//title")),
Descr = sNorm(getXText(CurItem, "//description")),
Refs = eXElem(CurItem, "//references"),
Depr = getXElem(CurItem, "//isReplacedBy"),
Status = getXAttr(CurItem, "status"),
(
Depr = null, !, Rep = " "
##
Rep = Depr
),
-
_ID;
_Title;
_Descr;
_Super;
_printTree(enum(Vec), ID);
_Rep;
_refsToList(Refs);
;
printTree(Enum, _) :- exhausted(Enum), !, [];
printTree(Enum, Super) :-
V = eValue(Enum),
[printTree(V, Super) | printTree(eNext(Enum), Super)]
;
t(N) :- trace("level", N);