Prüfungsaufgabe: XPATH Adressierungspfade

  • Prüfungsaufgabe: XPATH Adressierungspfade

    Hallo, ich brauche Hilfe bei einigen Aufgaben. Und zwar geht es um Adressierungspfade.
    Hier der Code:

    Quellcode

    1. <Bestellung>
    2. <Kopf Prio="hoch">
    3. <Besteller>
    4. <Kundennummer>7233</Kundennummer>
    5. </Besteller>
    6. <Empfänger>
    7. <Adresse>
    8. <Name>>Max Maier</Name>
    9. <Postanschrift>Musterstr. 7, 77223 Musterstadt </Postanschrift>
    10. </Adresse>
    11. </Empfänger>
    12. <Bestelldatum>31.02.07</Bestelldatum>
    13. <Lieferdatum>morgen</Lieferdatum>
    14. </Kopf>
    15. <Bestelldaten>
    16. <Arikel>
    17. <Bezeichnung>Scheinwerfer</Bezeichnung>
    18. <Artikelnummer>17-02-255</Artikelnummer>
    19. <Anzahl>10</Anzahl>
    20. </Artikel>
    21. <Artikel>
    22. <Bezeichnung>Lampenhalter</Bezeichnung>
    23. <Artikelnummer>00-00-0000</Artikelnummer>
    24. <Anzahl>7</Anzahl>
    25. </Artikel>
    26. </Bestelldaten>
    27. </Bestellung>
    Alles anzeigen

    Hier soll ich die Elemente angeben, die durch folgende Adressierung qualifiziert werden:
    /*/Bestelldaten/Artikel[2] das müsste meiner Meinung nach

    Quellcode

    1. <Artikel>
    2. <Bezeichnung>Lampenhalter</Bezeichnung>
    3. <Artikelnummer>00-00-0000</Artikelnummer>
    4. <Anzahl>7</Anzahl>
    5. </Artikel>
    das hier sein.
    /*/Bestelldaten[2]/Artikel gibt es meiner Meinung nach gar nicht, da das Element Bestelldaten nur einmal vorkommt.
    //*[Artikelnummer='17-02-255']/../../*[1]/*[3] Das bedeutet soviel ich weiß:
    Alle Elemente, die nach dem Element Artikelnummer mit dem Attribut 17-02-255 kommen, 2 Knoten darunter liegen und... (weiter komm ich nicht)
    Außerdem ist noch gefragt, wie der Pfad nach //*[Artikelnummer='17-02-255'] weitergehen muss, wenn man die Anzahl der Artikel haben möchte.

    Jetzt gehts noch um DTD's:
    Ich habe folgende Daten und soll eine gemeinsame DTD in Tabellenform entwickeln:

    Fritz Müller
    Sparkasse AG
    Lilienstrasse 2
    77777 Rahnhausen
    Email: fritz.mue@web.com
    Web: keineechteseite.de

    Lotta Heinrich
    Postfach 326612
    70377 Stuttgart
    heinrichslotta@coding.com
    Tel: 11123/4456

    Heinz Binger
    Postfach 88887
    22377 Woistdas
    Email: binger@binger.de

    Mein Vorschlag:

    Brainfuck-Quellcode

    1. Elementname-------------------------- Inhaltsmodell------------------------------------------------------------------------ Attribute
    2. Kontaktdaten___________________ Postanschrift, sonstige Kontaktmöglichkeiten
    3. Postanschrift___________________ Name, ?Firma, Straße|Postfach, PLZ, Stadt
    4. Name__________________________ Vorname, Nachname
    5. sonstige Kontaktmöglichkeiten____ Email, ?Telefon, ?Web
    6. Vorname________________________ #PCDATA
    7. Nachname _______________________#PCDATA
    8. Firma____________________________#PCDATA
    9. Straße___________________________#PCDATA
    10. Postfach_________________________#PCDATA
    11. PLZ______________________________#PCDATA
    12. Stadt____________________________#PCDATA
    13. Email____________________________#PCDATA
    14. Telefon__________________________#PCDATA
    15. Web_____________________________#PCDATA
    Alles anzeigen



    Ist das soweit richtig?

    Wie kriege ich das hin, dass z.B. beim Element Email der Text Email optional auftaucht und danach erst die Adresse?

    Ich hoffe, jemand von euch kann mir helfen, und sagen, wies richtig geht ^^ ist echt wichtig.
    PS: Falls ich als Neuling gegen irgendwelche Regeln verstoßen haben sollte, oder im falschen Thread gepostet habe, tut mir leid....

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von slaytallicer ()

  • Mit welchen Programmen arbeitet ihr denn? Bzw. was hindert dich daran es einfach auszuprobieren?

    /*/Bestelldaten/Artikel[2]
    korrekt, 2ter Artikel Node

    /*/Bestelldaten[2]/Artikel
    korrekt, es gibt keine Lösung

    //*[Artikelnummer='17-02-255']/../../*[1]/*[3]
    Die Lösung heißt 31.02.07

    Der Suchausdruck ist folnder:
    //*[Artikelnummer='17-02-255']/../Artikel

    Hier das Lösungsprogramm:

    Quellcode

    1. <?xml version="1.0" encoding="utf-8"?>
    2. <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    3. <xsl:template match="/">
    4. <html><body>
    5. <h1>Aufgabe1</h1>
    6. <xsl:for-each select="/*/Bestelldaten/Artikel[2]">
    7. <xsl:copy><xsl:value-of select="." /></xsl:copy>
    8. </xsl:for-each>
    9. <h1>Aufgabe2</h1>
    10. <xsl:for-each select="/*/Bestelldaten[2]/Artikel">
    11. <xsl:copy><xsl:value-of select="." /></xsl:copy>
    12. </xsl:for-each>
    13. <h1>Aufgabe3</h1>
    14. <xsl:for-each select="//*[Artikelnummer='17-02-255']/../../*[1]/*[3]">
    15. <xsl:copy><xsl:value-of select="." /></xsl:copy>
    16. </xsl:for-each>
    17. <h1>Aufgabe4</h1>
    18. <xsl:copy><xsl:value-of select="count(//*[Artikelnummer='17-02-255']/../Artikel)" /></xsl:copy>
    19. </body></html>
    20. </xsl:template>
    21. </xsl:stylesheet>
    Alles anzeigen


    Zur DTD würde ich dir auch empfehlen eine XML File und eine DTD File zu erstellen und diese miteinander zu validieren.
    Einfach als DOCTYPE einbinden. Spontan fällt mir auf: Wo ist das Rootelement? Schreibt man die Anzahl an Wiederholungen vor den Elementnamen?

    Quellcode

    1. <?xml version="1.0" encoding="ISO-8859-1" ?>
    2. <!DOCTYPE ressourcen SYSTEM "ressourcen.dtd">
    3. <adressbuch>
    4. ....
  • Hey!



    Erstmal vielen Dank für die schnelle Antwort!
    Ich arbeite mit gar keinem speziellen Programm, das war alles Teil einer Prüfung, die ich leider nachholen muss... und die Vorlesung dazu war alles nur theoretisch.... Unübersichtliches Skript und zuschaun wie der Dozent mit dem Laserpointer Quellcode entlang fährt...

    Was gibts denn in der XML-Ecke an sinnvollen Editoren? Kenne mich da noch gar nicht aus...


    Ein paar Dinge wollen mir aber noch nicht in den Kopf...:
    //*[Artikelnummer='17-02-255']/../../*[1]/*[3] (Derartige Pfade werden mit keinem Wort im Skript erwähnt...)
    Wenn ich, nachdem ich seit heute morgen XML-Tutorials wälze,versuche, den Pfad zu verfolgen, komme ich bis zum Element Bestelldaten. Was ich mit /*[1]/*[3] anfangen soll... Keine Ahnung... :(

    Dass man die Anzahl an Wiederholungen hinter den Elementnamen schreibt, hab ich vor ca. einer Stunde rausgefunden :)
    Rootelemente, etc. waren hier nicht gefragt, es ging nicht um Syntax, lediglich um eine grafische Darstellung der DTD. Müssen da noch Attribute eingefügt werden? Und was muss ich angeben, damit die Texte "Tel:" "Email" und "Web", wenn erfordert, angezeigt werden? Meine Idee hierzu wäre (jetzt mal in Quellcode ^^ :(
    <!ELEMENT Email ("Email:"?, #PCDATA)>
    oder
    <!ELEMENT Email (Bezeichnung?, #PCDATA)>
    <!ELEMENT Bezeichnung ("Email:")>
  • Hi, gute Tools findest du hier: XML Einstieg
    Ich hab jetzt nur den Firefox genutzt.

    Zu deinem Problemkind:
    • //*[Artikelnummer='17-02-255']
    • Suche mir den Node, das ein Element mit Artikelnummer 17-02-255 beinhaltet
    • <Artikel>...</Artikel>
    • //*[Artikelnummer='17-02-255']/..
    • Gehe eins hoch
    • <Bestelldaten>...</Bestelldaten>
    • //*[Artikelnummer='17-02-255']/../..
    • Gehe noch eins hoch (=root element)
    • <Bestellung>...</Bestellung>
    • //*[Artikelnummer='17-02-255']/../../*[1]
    • Suche das erste Unterelement
    • <Kopf>...</Kopf>
    • //*[Artikelnummer='17-02-255']/../../*[1]/*[3]
    • Suche das dritte Unterelement
    • <Bestelldatum>31.02.07</Bestelldatum>
    @DTD Validierung: Wie gesagt, bau mal den XML Baum, dann schau ich mir an, ob das Sinn macht. Klar, kann ich mir das auch aus der DTD erschließen, aber du wirst die DTD bestimmt nicht ohne XML Vorlage erstellt haben, oder?
  • So, ich hoffe jetzt mal, dass die DTD zu den vorgegebenen Adressen passt. Hab mir gedacht ich mach das ganze auf Sparflamme, also net weiter in Vorname, Nachname etc. unterteilen. Und dieses "Email: ..." lässt sich glaub ich gar nicht so angeben, dass es nicht immer erscheint, oder? Dann muss das halt mit in den Text...

    Fritz Müller
    Sparkasse AG
    Lilienstrasse 2
    77777 Rahnhausen
    Email: fritz.mue@web.com
    Web: keineechteseite.de

    Lotta Heinrich
    Postfach 326612
    70377 Stuttgart
    heinrichslotta@coding.com
    Tel: 11123/4456

    Heinz Binger
    Postfach 88887
    22377 Woistdas
    Email: binger@binger.de

    Quellcode

    1. <!ELEMENT Kontaktdaten (Name, Firma?, Adresse, Kontaktmöglichkeit)>
    2. <!ELEMENT Adresse(Postfach|StraßeHsnr, PLZStadt)>
    3. <!ELEMENT Kontaktmöglickeit(Email, Homepage?, Telefon?)>
    4. <!ELEMENT Name (#PCDATA)>
    5. <!ELEMENT Firma (#PCDATA)>
    6. <!ELEMENT Postfach (#PCDATA)>
    7. <!ELEMENT StraßeHsnr (#PCDATA)>
    8. <!ELEMENT PLZStadt (#PCDATA)>
    9. <!ELEMENT Email (#PCDATA)>
    10. <!ELEMENT Homepage (#PCDATA)>
    11. <!ELEMENT Telefon (#PCDATA)>
    Alles anzeigen
  • Postfach|StraßeHsnr << Ob man bei Elementen ein entweder-oder verwenden kann, weiß ich nicht auswendig. Ich dachte das sei den Attributen vorbehalten.
    Aber wie gesagt: Erstell dir eine XML Datei dazu und validier die Dateien gegeneinander. Entweder mit einem Online Validator wie validome.org oder mit einem geeigneten Tool: XML Anwendungen

    Ob die einfache Lösung reicht, kann ich nicht beurteilen. Man kann das beliebig komplex machen.
    Zum Beispiel könnte man Adresse und Telefon beliebig wiederholbar machen und ein Pflichtattribut mit Werten wie "privat" oder "geschäftlich" hinzufügen.