Announcement

Collapse
No announcement yet.

Xpath Abfragen:

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • Xpath Abfragen:

    Hi, ich versuche mich auf eine Prüfung vorzubereiten und habe mir alte Prüfungsangaben hergenommen und will diese nun lösen

    XML:
    Code:
    <ehepaare>
    
      <ehepaar hochzeitsTag="1983-01-22">
    
        <scheidung>2001-12-24</scheidung>
    
        <mann svnr="2948120145">Karli Zwiefel</mann>
    
        <frau svnr="1234050342">Mitzi Knofel</frau>
    
        <standesamt>Wien 9</standesamt>
    
      </ehepaar>
    
      <ehepaar hochzeitsTag="2002-08-12">
    
        <frau svnr="1234050342">Mitzi Knofel</frau>
    
        <mann svnr="3203070382">Franz Radiwurzn</mann>
    
        <standesamt>St. Pölten</standesamt>
    
      </ehepaar>
    
      <ehepaar hochzeitsTag="1954-09-02">
    
        <standesamt>Los Angeles</standesamt>
    
        <frau svnr="4419021232">Jane Doe</frau>
    
        <mann svnr="1934081220">Henry Chinaski</mann>
    
        <scheidung>1957-01-01</scheidung>
    
      </ehepaar>
    
      <ehepaar hochzeitsTag="1998-02-02">
    
        <mann svnr="4756260268">Ihsan Farha</mann>
    
        <frau svnr="3487010157">Chip Stack</frau>
    
        <standesamt>Las Vegas</standesamt>
    
      </ehepaar>
    
    </ehepaare>
    Folgende Fragestellung, mittels Xpath lösen:

    1.) Anzahl der am Standesamt St. Pölten geschlossenen Ehen

    2.) Alle Standesämter, an denen bereits Ehen geschlossen wurden, jedoch nur solche, die nicht geschieden wurden.

    3.) Die Namen aller Frauen, die bereits mehrmals verheiratet waren. (svnr ist eindeutig)

    4.) Die Scheidungsrate (Verhältnis geschiedenen zu nicht geschiedenen Ehen)

    @ 1.) meine Lösung wäre (funktioniert auch):
    Code:
    count(//ehepaar[standesamt = 'St. Pölten'])
    gibt es bessere Lösungsvorschläge?

    @ 2.) meine Lösung wäre (funktioniert ebenfalls):
    Code:
    //ehepaar[not(boolean(scheidung))]/standesamt
    auch da, gibt es besser lösungen?

    @3.) da haperts bei mir komplett...
    wie kann ich 2 knoten miteinander vergleichen?

    @ 4.) ebenfalls schwierigkeiten, tutorials beschäftigen sich mit so etwas wenig bis gar nicht, wie man mit werten (count-ergebnissen?) rechnet...

    Bin für jede Hilfe dankbar!

  • #2
    Zu 1.) Die Benutzung von // ist nicht nötig, du könntest auch den Pfad ausschreiben, also
    Code:
    count(/ehepaare/ehepaar[standesamt = 'St. Pölten']
    Zu 2.) "not(boolean(scheidung))" ist nicht nötig, es reicht einfach "not(scheidung)"
    Zu 3.)
    Code:
    /ehepaare/ehepaar/frau[@svnr = ../preceding-sibling::ehepaar/frau/@svnr]
    Zu 4.)
    Code:
    count(/ehepaare/ehepaar[scheidung]) div count(/ehepaare/ehepaar[not(scheidung)])

    Comment


    • #3
      Werde es erst am Nachmittag kontrollieren/testen können,

      bedanke mich aber mal ganz herzlich für die Hilfe!

      Comment


      • #4
        Martin du bist der beste
        habs nun getestet, nochmals big thx, hat mir sehr geholfen, vor allem versteh ich es jetzt auch besser wie das funktioniert und kann es (hoffentlich) auch bei ähnlichen beispielen anwenden!

        Thx!

        Comment


        • #5
          Nochmals Unterstützung bitte

          Code:
          <wohnungen>
          
            <makler>Immobilienbüro Dr. Rohdiamant</makler>
          
            <wohnung ort="Gols" info="möbliert">
          
              <eigentuemer>«VORNAME» «NACHNAME»</eigentuemer>
          
              <mieter>-</mieter>
          
              <typ>Geschäft</typ>
          
              <typ>Pacht</typ>
          
              <zimmer>7</zimmer>
          
            </wohnung>
          
            <wohnung ort="Wien 17" flaeche="92">
          
              <eigentuemer>M. Derntl</eigentuemer>
          
              <mieter>H. Reisinger</mieter>
          
              <typ>Miete Geschäft</typ>
          
            </wohnung>
          
            <wohnung ort="Linz" flaeche="152" info="Altbaujuwel"></wohnung>
          
            <wohnung ort="Graz" wohnflaeche="68">
          
              <eigentuemer>A. Schwarzenegger</eigentuemer>
          
              <typ>Geschäft</typ>
          
              <mieter></mieter>
          
            </wohnung>
          
            <wohnung ort="Wien 21" flaeche="98m²">
          
              <eigentuemer>M. Derntl</eigentuemer>
          
              <mieter>H. Hölzl</mieter>
          
              <typ>Pacht</typ>
          
            </wohnung>
          
          </wohnungen>
          Xpath:

          -) Alle Orte, in denen es mindestens 2 Wohnungen vom Typ "Miete" gibt

          oder in dem Beispiel, damit auch tatsächlich was angezeigt wird, leicht umgeändert (und damit ich es dann besser verstehe)

          -) Alle Orte, in denen 1 Typ Geschäft und 1 Typ Pacht ist

          Many thx im voraus!

          Comment


          • #6
            Code:
            /wohnungen/wohnung[typ = 'Geschäft' and typ = 'Pacht']/@ort
            sollte der zweiten Anfrage entsprechen, solange mindestens ein typ Pacht bzw. Geschäft gemeint ist.
            Allerdings werden dabei Duplikate nicht entfernt, das ist mit XPath 1.0 nicht möglich.

            Die erste Anfrage sollte mit
            Code:
            /wohnungen/wohnung[typ = 'Miete' and @ort = preceding-sibling::wohnung[typ = 'Miete']/@ort]/@ort
            , aber auch hier werden dann einfach existierende 'ort'-Attributsknoten selektiert, die die Bedingung erfüllen, dabei können dann Orte mehrfach vorkommen.

            Comment


            • #7
              Originally posted by Martin Honnen View Post
              Code:
              /wohnungen/wohnung[typ = 'Geschäft' and typ = 'Pacht']/@ort
              sollte der zweiten Anfrage entsprechen, solange mindestens ein typ Pacht bzw. Geschäft gemeint ist.
              Allerdings werden dabei Duplikate nicht entfernt, das ist mit XPath 1.0 nicht möglich.

              Die erste Anfrage sollte mit
              Code:
              /wohnungen/wohnung[typ = 'Miete' and @ort = preceding-sibling::wohnung[typ = 'Miete']/@ort]/@ort
              , aber auch hier werden dann einfach existierende 'ort'-Attributsknoten selektiert, die die Bedingung erfüllen, dabei können dann Orte mehrfach vorkommen.
              okay, das mit dem abgeänderten beispiel ist in die hose gegangen, meinte damit eine andere Variante ebenfalls mit preceding-sibling, macht aber da sowieso keinen sinn, somit ist deine Lösung natürlich "einfach" und meine Abänderung "sinnlos" trotzdem danke!

              die zweite ist dann natürlich eher das was ich mir gewünscht habe und funktioniert wie immer tadellos! Auf dich ist Verlass!

              DANKE!

              Comment

              Working...
              X