Jörg: externe Liste verarbeiten

Hallo,

ich fange gerade mit xslt an - ist ein spannendes Thema. Ich möchte eine generierte .xml-Liste im Browser anzeigen lassen, die ich "on-the-fly" per xsl transformieren lasse. Dabei sollen nur Listeneinträge angezeigt werden, deren <attr2> nicht in einer zweiten .xml-Datei als <ausschluss> deklariert ist.

Beispiel:

xml-1 (daten.xml):

<status>
  <eintrag>
    <attr1>Objekt1</attr1>
    <attr2>aktion</attr2>
  </eintrag>
  <eintrag>
    <attr1>Objekt2</attr1>
    <attr2>wartend</attr2>
  </eintrag>
  <eintrag>
    <attr1>Objekt3</attr1>
    <attr2>fertig</attr2>
  </eintrag>
  ...
</status>

xml-2 (ausschluesse.xml):

<ausschluesse>
 <ausschluss>fertig</ausschluss>
 <ausschluss>geliefert</ausschluss>
 ...
</ausschluesse>

Ich bekomme es nicht hin, die xml-2 korrekt einzulesen und zu verarbeiten. Außerdem fehlt mir jede Idee, wie ich die Abfrage gestalten soll. Jedesmal mit xsl:if und so - das muss doch noch anders gehen.

Hat jemand eine Idee?

Schon mal vielen herzlichen Dank im Voraus,
Jörg

PS: Habe gesucht - leider nichts gefunden:(

  1. Hallo,

    ich fange gerade mit xslt an - ist ein spannendes Thema. Ich möchte eine generierte .xml-Liste im Browser anzeigen lassen, die ich "on-the-fly" per xsl transformieren lasse. Dabei sollen nur Listeneinträge angezeigt werden, deren <attr2> nicht in einer zweiten .xml-Datei als <ausschluss> deklariert ist.

    Hier mal eine Demo mit Deinen Daten: http://www.christian-seiler.de/temp/forum-20080425-daten.xml

    Sourcecode des Stylesheets:
    http://www.christian-seiler.de/temp/forum-20080425-stylesheet.xsl

    Das wichtigste Stichwort ist hier document() - das lädt ein externes Dokument nach. Außerdem muss man hier mit mindestens einer Variable (in diesem Fall $aktion) arbeiten:

    <xsl:variable name="aktion" select="attr2" />  
    <xsl:if test="count($ausschluesse/ausschluss[. = $aktion]) = 0">
    

    (Das $ausschluesse habe ich hier nur zur Übersicht drin, da könnte direkt docuemnt(...)/... stehen)

    Im Prinzip könnte man meinen, dass ein count($ausschluesse/ausschluss[. = attr2]) ausreichen sollte. Das funktioniert aber nicht, da in dem Qualifier (also den eckigen Klammern) der Kontext des Elements ausschluss im anderen Dokument gilt - und dort gibt es kein Kindelement attr2. Daher muss man das Element attr2 aus dem aktuellen Kontext in eine Variable kopieren, um es dann im XPath-Ausdruck verwenden zu können.

    Im Prinzip würde sich für so eine Aufgabe auch <xsl:key /> anbieten. Das hat allerdings ein großes Problem: Es funktioniert (bei XSLT 1.0) nur für Knoten im aktuellen Dokument, d.h. wenn man ein externes Dokument nachlädt, kann man darauf keinen Key anwenden. XSLT 2.0 würde so etwas anbieten, aber das können die Browser ja nicht.

    Viele Grüße,
    Christian

    1. Hallo Christian,

      vielen Dank für deine Antwort - hat prima geklappt.

      Jetzt habe ich nur noch eine Frage: Wenn $aktion nur ein Muster ist, nach dem in attr2 gesucht werden soll, dann funktioniert das nicht. Ich habe da an die Contains()-Funktion gedacht, weiss aber nicht, wie ich sie einbauen kann:

      <xsl:if test="count($ausschluesse/ausschluss[. = $aktion]) = 0">

      Ich bin davon überzeugt, dass dies möglich ist. Und am Ende noch das i-Tüpfelchen: die Gruppierung nach den gefilterten attr2...

      Wenn du mir da den Weg zeigen könntest, wäre ich richtig dankbar:-)

      Viele Grüße,
      Jörg

      PS: Wie bekommst du eigentlich die Farben im Quelltext hin? Stehen dir beim Posten noch andere Optionen zur Verfügung?

      1. Hallo Jörg,

        Jetzt habe ich nur noch eine Frage: Wenn $aktion nur ein Muster ist, nach dem in attr2 gesucht werden soll, dann funktioniert das nicht. Ich habe da an die Contains()-Funktion gedacht, weiss aber nicht, wie ich sie einbauen kann:

        <xsl:if test="count($ausschluesse/ausschluss[. = $aktion]) = 0">

        Was genau heißt "Muster"? "Ist Teilstring von"? Das ginge so:

        <xsl:if test="count($ausschluesse/ausschluss[contains($aktion, .)]) = 0">

        (Damit kann man z.B. <ausschluss>erti</ausschluss> angeben und das matcht auch auf "fertig".)

        Und am Ende noch das i-Tüpfelchen: die Gruppierung nach den gefilterten attr2...

        Gruppieren ist etwas komplizierter, das ist zum Beispiel unter http://www.jenitennison.com/xslt/grouping/muenchian.html erklärt.

        Wenn man das ganze dann auf Deine Beispieldaten anwendet, erhält man zum Beispiel das hier:

        http://www.christian-seiler.de/temp/forum-20080425-daten-2.xml

        Ich habe das dort zur Klarstellung auf zwei verschiedene Arten hinzugefügt, damit man beispielhaft sehen kann, wie das funktioniert (zusammen mit der Filterung).

        Hier lohnt es sich auch, sich mit XSLT Keys zu beschäftigen, um das ganze völlig zu verstehen.

        PS: Wie bekommst du eigentlich die Farben im Quelltext hin? Stehen dir beim Posten noch andere Optionen zur Verfügung?

        </hilfe/bedienung.htm#postings-formatieren>

        Viele Grüße,
        Christian

        1. Hallo Christian,

          vielen herzlichen Dank für deine Hilfe und Anregungen - es tut gut, kompetente Ansprechpartner zu finden. Das Problem konnte nun gelöst werden.

          Danke,
          Jörg