PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : XSLT 2.0: Sehr komplexer Vergleich!


Ladon
30.06.2006, 16:43
Hallo zusammen.
Ich hab hier nun wirklich eine komplexe Aufgabe bei der ich nicht weiter komme.
Es ist auch relativ schwierig die Logik zu verstehen.
Aber ich hoffe trotzdem das mir hier jemand helfen kann...

Ich komme hier auch gleich mal zum Wesentlichen:



Datei_1.xml
***********
<Liste_1>
<Nummer>1</Nummer>
<Nummer>2</Nummer>
<Nummer>3</Nummer>
<Nummer>4</Nummer>
<Nummer>5</Nummer>
</Liste_1>
<!--Neben <Liste_1> dürfen die Nummern 1-5 nicht existieren.-->
-------------------------

Datei_2.xml
***********
<G1 key="1">
<data zahl="1"/>
<data zahl="2"/>
<data zahl="3"/>
<data zahl="4"/>
</G1>
<!--Neben key="1"(entspricht Liste_1) dürfen die "zahlen"/Nummern 1-4 nicht existieren.-->

<G5 key="5">
<data zahl="1"/>
<data zahl="7"/>
<data zahl="8"/>
<data zahl="9"/>
</G5>
<!--Neben key="5"(entspricht Liste_5) dürfen die Nummern 1;7;8;9 nicht existieren.-->
<!--Es darf neben key="5"(Liste_5) nicht die zahl="1"(Nummer 1) existieren-->
<!--Darum darf neben Liste_1 auch nicht die Nummer 5 existieren-->


--------------------

Key-Nummer in Datei_2.xml entsprechen Liste_* in Datei_1.xml
Also:
<G1 key="1"> entspricht <Liste_1>
<G2 key="2"> würde <Liste_2> entsprechen.
<G5 key="5"> würde <Liste_5> entsprechen.

--------------------


Bisher wird geprüft:
********************
1.Prüfung:
"Liste"-Knoten und "key"-Attribut werden geprüft, ob ihre Ziffer identisch ist.
In diesem Fall sind es:
<Liste_1> wird mit <G1 key="1"> verglichen.

2.Prüfung:
Sind "Liste" und "key" identisch, prüfe ob <Liste_1/Nummer> und <G1/data/@zahl> identisch
sind.

3.Prüfung:
Ist in <Liste_1/Nummer> eine Zahl, die NICHT in <G1/data/@zahl> vorhanden ist,
gib diese Zahl in einer Liste <Zu_Viel> aus.
Ist in <G1/data/@zahl> eine Zahl, die NICHT in <Liste_1/Nummer> vorhanden ist,
gib diese Zahl in einer Liste <Zu_Wenig> aus.


Jetzt wird wieder eine neue <Liste> mit einem neuen "<key>" verglichen.
Ist dies wieder identisch, beginnt das ganze wieder von vorne.

--------------------


Nun soll aber anstatt der 3.Prüfung folgendes geprüft werden:
**************************************************************
Ist in <Liste_1/Nummer> eine Zahl, die NICHT in <G1/data/@zahl> vorhanden ist,
in diesem Beispiel <Nummer>5</Nummer>, prüfe ob key="5" vorhanden ist.

Ist key="5" vorhanden, prüfe ob <data zahl="1"/> vorhanden ist.
Ist dies vorhanden, gib diese Zahl (in diesem Fall: 1) nicht aus.



Der bisherige Code ist zu komplex als das ich ihn hier zeigen könnte.
Für diese Aufgabe ist das ja auch garnicht nötig.


Also ich hoffe das jemand von euch mir hier weiterhelfen kann...

Schon mal vielen herzlichen Dank für die Mühe!
Andreas


Scavi
04.07.2006, 12:38
Also ich habe die Erklärung nicht wirklich verstanden. Wieso dürfen gewisse Zahlen nicht in der Liste existieren? Erkläre nochmal in Text, was du zu tun hast.

Ladon
05.07.2006, 11:07
Wieso dürfen gewisse Zahlen nicht in der Liste existieren? Erkläre nochmal in Text, was du zu tun hast.


Ich weiß, es ist sehr kompliziert das zu Beschreiben...
Also:
Sagen wir, das ganze handelt sich um Lieferungen.



Datei_1.xml
***********
<Liste_1> <!--Lieferzettel 1-->
<Nummer>1</Nummer>
<Nummer>2</Nummer>
<Nummer>3</Nummer>
<Nummer>4</Nummer>
<Nummer>5</Nummer>
</Liste_1>
<!--Hier stehen die Liefernummern, die NICHT in der ersten Lieferung enthalten sein dürfern. Ist quasie eine "Schwarze Liste" die zeigt, was NICHT in der ersten Lieferung enthalten sein darf.
..Ich weiß, klingt komisch..ist aber so.. ;-)-->
-------------------------

Datei_2.xml
***********
<G1 key="1"><!--Lieferzettel 1-->
<data zahl="1"/>
<data zahl="2"/>
<data zahl="3"/>
<data zahl="4"/>
</G1>
<!--Das gleiche wie vorher...-->

<G5 key="5"><!--Lieferzettel 5-->
<data zahl="1"/>
<data zahl="7"/>
<data zahl="8"/>
<data zahl="9"/>
</G5>
<!--Das gleiche wie vorher...-->

Wenn nun eine Liefernummer auf dem Lieferzettel 1 steht, die NICHT auf dem Lieferzettel 1 in der Datei_2.xml existiert, soll geprüft werden, ob die LieferNUMMER auch als LieferZETTEL vorhanden ist.
Hier wäre das die LieferNummer 5.
Es wird also geprüft, ob in Datei_2.xml einen LieferZETTEL 5 gibt.
Ist auf dem LieferZETTEL 5 die LieferNUMMER(zahl..) 1 (die wiederum in Datei_1.xml den LieferZETTEL 1 entspricht), soll diese NICHT in dem output stehen.

Datei_2.xml ist also immer die Prüfdatei für Datei_1.xml
Zuerst schaut Datei_1.xml den gleichen Lieferzettel an, und sucht die gleiche nummer/zahl.
Ist diese nicht vorhanden, Wird diese Zahl selbst als Lieferzettel gesucht.
Ist sie gefunden, wird geprüft, ob in dieser die Nummer des aktuellen Lieferzettels in DAtei_1.xml enthält.
Wenn ja, keine Ausgabe.
Die prüfung hat den grund, das einfach bestimmte Nummern nicht in einer Lieferung enthalten sein dürfen.
Und logischer weiße auch umgekehrt.


Ist es einigermaßen verständlicher?
Vielen Dank!
Ladon

Scavi
05.07.2006, 12:09
Mach Dir erstmal eine Variable mit allen Liefernummern je Lieferzettel, die nicht auf den Lieferzetteln in Datei2 exisitieren. Dann selektierst du aus obiger Variable alle Nummern, für die es einen Lieferzettel gibt (=neue Variable). Dann prüfst du für alle Zettel dieser Variable, ob Zahlen die in der 1. Variable als Ergebnis stehen vorkommen.

Ladon
05.07.2006, 13:33
Ok..
ich werde das mal versuchen...
wenn ich die Lösung habe, stelle ich sie hier rein.
Vielleicht interessiert es ja den einen oder anderen...

Grüße
Ladon