realShadow: XML Daten anzeigen (die 3.)

Hi Leute,

zunächst erstmal danke für eure Hilfe so far. Ich möchte XML Daten über eine XSL Datei darstellen und aus einer HTML einzelne Datensätze anzufragen und darzustellen. Die Dateien sehen wie folgt aus:

--------------------XML-------------------------
<?xml version="1.0"?>
<?xml-stylesheet type="text/xsl" href="prozess.xsl" ?>
<Prozesse>
    <Prozess id="001">
      <Bereich>Konfiguration</Bereich>
      <Verantwortlicher>Müller</Verantwortlicher>
      <Durchfuehrender>Schulz</Durchfuehrender>
      <Daten>
        <Eingang>Fax</Eingang>
        <Ausgang>Mail</Ausgang>
      </Daten>
    </Prozess>
    <Prozess id="002">
      <Bereich>Authorisation</Bereich>
      <Verantwortlicher>Schmidt</Verantwortlicher>
      <Durchfuehrender>Peter</Durchfuehrender>
      <Daten>
        <Eingang>Telefon</Eingang>
        <Ausgang>Fax</Ausgang>
      </Daten>
    </Prozess>
    <Prozess id="003">
      <Bereich>Bestellung</Bereich>
      <Verantwortlicher>Groß</Verantwortlicher>
      <Durchfuehrender>Hans</Durchfuehrender>
      <Daten>
        <Eingang>Mail</Eingang>
        <Ausgang>Internet</Ausgang>
      </Daten>
    </Prozess>
</Prozesse>

--------------------XSL-------------------------
<?xml version="1.0" encoding="iso-8859-1"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:param name="idparam"/>

<xsl:template match="Prozesse">
  xsl:textID:</xsl:text><xsl:value-of select="$idparam"/><br />
  xsl:textBereich</xsl:text><xsl:value-of select="Prozess[@id = $idparam]/Bereich/text()"/><br />
  xsl:textVerantwortlicher</xsl:text><xsl:value-of select="Prozess[@id = $idparam]/Verantwortlicher/text()"/><br />
  xsl:textDurchfuehrender</xsl:text><xsl:value-of select="Prozess[@id = $idparam]/Durchfuehrender/text()"/><br />
  xsl:textDaten</xsl:text><br />
    xsl:textEingang</xsl:text><xsl:value-of select="Prozess[@id = $idparam]/Daten/Eingang/text()"/><br />
    xsl:textAusgang</xsl:text><xsl:value-of select="Prozess[@id = $idparam]/Daten/Ausgang/text()"/><br />

</xsl:template>

</xsl:stylesheet>

Wie kann ich jetzt die XML Datei aufrufen, dass nur ein Datensatz angezeigt wird? Es gibt wohl auch schon ein Thread dazu, nämlich
http://forum.de.selfhtml.org/archiv/2006/3/t126420/#m815491 aber das ist mir ein wenig zu kompliziert. Ich habe auch leider keine Zeit mich da großartig einzulesen. Ich brauche nur einen Einfachen Mechanismus, das File so zu öffnen, dass der Datensatz angezeigt wird. Das ganze kann auch nur im Browser funktionieren, da ich keinen Server habe um das ganze Serverseitig abzuwicklen.
Wäre für eure Hilfe echt dankbar.

Gruß
realShadow

  1. Hallo,

    zunächst erstmal danke für eure Hilfe so far. Ich möchte XML Daten über eine XSL Datei darstellen und aus einer HTML einzelne Datensätze anzufragen und darzustellen. Die Dateien sehen wie folgt aus:

    [...]

    Wie kann ich jetzt die XML Datei aufrufen, dass nur ein Datensatz angezeigt wird? Es gibt wohl auch schon ein Thread dazu, nämlich
    http://forum.de.selfhtml.org/archiv/2006/3/t126420/#m815491 aber das ist mir ein wenig zu kompliziert. Ich habe auch leider keine Zeit mich da großartig einzulesen. Ich brauche nur einen Einfachen Mechanismus, das File so zu öffnen, dass der Datensatz angezeigt wird. Das ganze kann auch nur im Browser funktionieren, da ich keinen Server habe um das ganze Serverseitig abzuwicklen.
    Wäre für eure Hilfe echt dankbar.

    OK, wenn das Bsp. dir zu kompliziert ist, machen wir das einfacher (aber ein "habe [...] keine Zeit mich da [...] einzulesen" kann für die Zukunft fatal sein):

    Am besten du gehst von einer HTML-Datei aus:

    -------------------------
    <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
    <html>
    <head>
     <title>Prozesse</title>
     <script language="JavaScript" type="text/javascript">
      var XMLDatei = "prozesse.xml"; // Pafad zur XML-Datei
      var XSLDatei = "prozesse.xsl"; // Pafad zur XSL-Datei
      var objectXML;
      var objectXSL;
      var objectXSLCache;
      var objectXSLTProcessor;
      var HTMLAusgabe;
      var idparam = "";

    function transformation() {
       // Abfrage für den Internet Explorer
       if (window.ActiveXObject) {
        // XML laden
        objectXML = new ActiveXObject("MSXML2.DOMDocument");
        objectXML.async = false;
        objectXML.load(XMLDatei);

    // XSL laden
        objectXSL = new ActiveXObject("MSXML2.FreeThreadedDOMDocument.4.0");
        objectXSL.async = false;
        objectXSL.load(XSLDatei);
        //cachen das XSLT für bessere performance
        objectXSLCache = new ActiveXObject("Msxml2.XSLTemplate.4.0");
        objectXSLCache.stylesheet = objectXSL;
       }
       // Abfrage für Mozilla / Netscape
       else if (window.ChromeWindow) {
        // Im Mozilla erst XSL laden
        objectXSLTProcessor = new XSLTProcessor();
        objectXSL = new XMLHttpRequest();
        objectXSL.open("GET", XSLDatei, false);
        objectXSL.send(null);
        objectXSL = objectXSL.responseXML;
        objectXSLTProcessor.importStylesheet(objectXSL);

    // XML laden
        objectXML = new XMLHttpRequest();
        objectXML.open("GET", XMLDatei, false);
        objectXML.send(null);
        objectXML = objectXML.responseXML;
       }
       else {
        alert("Ihr Browser unterstützt leider keine XML-XSL-Transformation mittels JavaScript");
       }
       //erste Transformation mit leerem Parameter aufrufen:
       refreshresults(idparam);
      }
      function refreshresults(idparam) {
       if (window.ActiveXObject) {
        objectXSLTProcessor = objectXSLCache.createProcessor();
        objectXSLTProcessor.input = objectXML;
        objectXSLTProcessor.addParameter("idparam", idparam, "");
        objectXSLTProcessor.transform();
        document.getElementById("results").innerHTML = objectXSLTProcessor.output;
       }
       else if (window.ChromeWindow) {
        var myParam = objectXSLTProcessor.getParameter(null, "idparam");
        objectXSLTProcessor.setParameter(null, "idparam", idparam);
        HTMLAusgabe = objectXSLTProcessor.transformToFragment(objectXML, document);
        document.getElementById("results").innerHTML = "";
        document.getElementById("results").appendChild(HTMLAusgabe);
       }
      }
     </script>
    </head>

    <body onload="transformation();" id="results">

    </body>
    </html>
    ----------------------

    Die XSL-Datei sollte dazu so in etwas aussehen (ich habe ein Formular eingebaut, da ich nicht wusste wie du eigentlich die IDs zu übergeben beabsichtigst)

    --------------------------------------
    <?xml version="1.0" encoding="iso-8859-1"?>
    <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:param name="idparam"/>
    <xsl:template match="Prozesse">
     <form id="pForm" name="pForm">
      <select name="prozesse" onchange="refreshresults(this.form.prozesse.options[this.form.prozesse.selectedIndex].value);">
       <option value="">
        <xsl:if test="$idparam = ''"><xsl:attribute name="selected">selected</xsl:attribute></xsl:if>
        xsl:textProzess wählen</xsl:text>
       </option>
       <xsl:for-each select="Prozess">
        <option value="{@id}">
        <xsl:if test="$idparam = @id"><xsl:attribute name="selected">selected</xsl:attribute></xsl:if>
        xsl:textProzess: </xsl:text><xsl:value-of select="@id" />
        </option>
       </xsl:for-each>
      </select>
     </form>
     <div>
      ID: <xsl:value-of select="$idparam"/><br />
      Bereich: <xsl:value-of select="Prozess[@id = $idparam]/Bereich/text()"/><br />
      Verantwortlicher: <xsl:value-of select="Prozess[@id = $idparam]/Verantwortlicher/text()"/><br />
      Durchfuehrender: <xsl:value-of select="Prozess[@id = $idparam]/Durchfuehrender/text()"/><br />
      Daten<br />
      Eingang: <xsl:value-of select="Prozess[@id = $idparam]/Daten/Eingang/text()"/><br />
      Ausgang: <xsl:value-of select="Prozess[@id = $idparam]/Daten/Ausgang/text()"/><br />
     </div>
    </xsl:template>
    </xsl:stylesheet>

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

    Aus deinem XML kannst du die Zeile: <?xml-stylesheet type="text/xsl" href="..." ?> entfernen.

    Ich habe dir zusätzlich alle drei Dateien als Test unter http://meta-text.net/test/prozesse.html hingestellt.

    Grüße
    Thomas

    1. Hallo Thomas,

      ich glaube ich habe es so langsam verstanden, wie es funktioniert. Die Übergabe der ID's soll aus einem Link heraus erfolgen, das heißt, dass ein Nutzer einen Link anklickt, der die ID enthält. Dadruch soll die ID übergeben werden und, wie bereits mehrfach geschrieben, die XML bzw. XSL mit der ID "gefüttert" werden. Der Datensatz wird dann geladen und in einem anderen Frame dargestellt. Aber das ist relativ einfach. Bisher hat mir nur die Übergabe der ID große Probleme bereitet.
      Ich werde mich gleich heute nachmittag dransetzten und das alles Testen. Natürlich stimme ich dir zu was das einlesen und Zukunft angeht. Ich würde mir die Zeit auch gerne nehmen, das lässt aber mein Job nicht zu... leider. Hast du trotzdem ne Buchquelle bzw. Onlinequelle die das ganze verdeutlicht?

      Danke im Voraus.
      realShadow

    2. Hi Thomas,

      habe die Umsetzung mal versucht. Leider bekomme ich von IE gesagt "zugriff verweigert". Das steht unten in der Statusleiste Zeile 22 Zeichen 5? Damit weiß ich überhaupt nichts anzufangen.
      Als Ergänzung zu meiner vorherigen Antwort nur noch ein kurzer Code wie ich die ID übergeben möchte. Sollte ungefähr so aussehen

      <a href="javascript:refreshresults(001);">Link</a>

      Kann das so funktionieren?

      gruß
      realShadow

      1. Hallo,

        habe die Umsetzung mal versucht. Leider bekomme ich von IE gesagt "zugriff verweigert". Das steht unten in der Statusleiste Zeile 22 Zeichen 5? Damit weiß ich überhaupt nichts anzufangen.
        Als Ergänzung zu meiner vorherigen Antwort nur noch ein kurzer Code wie ich die ID übergeben möchte. Sollte ungefähr so aussehen

        <a href="javascript:refreshresults(001);">Link</a>

        Kann das so funktionieren?

        Das kann schon so funktionieren, aber das ist nur ein Link.
        Die Fragen sind also:

        • Woher soll ein Link die ID bekommen?
               D.h. sollen die Links und damit auch die IDs ebenfalls aus dem XML generiert werden?
        • Wie soll das ganze denn _genau_ funktionieren?
               Jetzt wurde aus der Seite, Frames. Ich sage gleich dazu, du kannst nicht domainübergreifend auf XMLs, die auf eine andere Domain liegen, zugreifen. (das genau vermutet aber die Zugriff verweitert Meldung). Siehe dazu (im Quelltext der Seite gucken!): http://www.unet.univie.ac.at/~a9105535/test/http_xml.html dort "mache" ich genau das.

        Grüße
        Thomas

        1. Hallo Thomas,

          zu deinen Fragen:

          • der Link bekommt die ID von mir zugewiesen. D.h. ich sage dem Link "du bist die 001", "du die 002" und du "die 003". Dadurch entfällt das generieren aus irgendeinem Dokument.
          • Die genaue Funktionsweise soll folgendermaßen aussehen. Ich rufe über einen Link die XML Datei auf. Der Link enthält die ID, die den Datensatz enthält, den ich anzeigen möchte. Anschließend wird die Darstellung in einem zweiten Frame der Seite angezeigt. Klickt man auf einen anderen Link enthält dieser wieder die ID mit dem anzuzeigenden Datensatz (ID). So habe ich eine einzige XML und XSL, die alles darstellen können. C'est ca. Es liegt dabei alles auf ein und dem Selben Server. Ich will nicht irgendwo auf einer anderen Domain zugreifen.

          Ich habe ein kleines Demo auf der Internetadresse http://realshadow.globedns.info/index2.html abgelegt. Schau doch mal bitte kurz nach, ob mein Vorhaben dadurch vielleicht deutlicher wird, und ob es überhaupt möglich ist. Ich gehe zwar davon aus, aber ich bin wie gesagt relativer newbie.

          Danke im Voraus.
          Gruß
          realShadow

        2. Hi Thomas,

          endlich habe ich es geschafft, das Script etwas genauer unter die Lupe zu nehmen. Es funktioniert auch soweit super. Nun noch eine Frage:

          • Funktioniert es auch, dass ich die Transformation in einem anderen Frame darstellen kann? Ich habe das schon versucht, aber leider bisher ohne Erfolg.
            Danke für ne Info.

          Gruß
          realShadow

          1. Hallo,

            endlich habe ich es geschafft, das Script etwas genauer unter die Lupe zu nehmen. Es funktioniert auch soweit super. Nun noch eine Frage:

            • Funktioniert es auch, dass ich die Transformation in einem anderen Frame darstellen kann? Ich habe das schon versucht, aber leider bisher ohne Erfolg.
              Danke für ne Info.

            In der Hauptseite:
            ------------------------
            <html>
            <head>
            <title>Hauptseite</title>
            </head>
            <body>
            <h2>ich bin die Hauptseite und enthalte ebenfalls statische Daten. Aus mir heraus kann das Frame "RECHTS"
            eine aufforderung enthalten, die Daten aus der XML/XSL darzustellen</h2>
            <a href="javascript:top.frames[3].refreshresults(001);;">001</a><br>
            <a href="javascript:top.frames[3].refreshresults(002);">002</a><br>
            <a href="javascript:top.frames[3].refreshresults(003);">003</a><br>
            </body>
            </html>
            -------------------------

            das [3] soll dich nicht irritieren, du hast 4-Frames, aber die Zählung beginnt bei 0.

            im linken Frame:
            ----------------------
            <h2>Ich bin Links</h2>
            <a href="javascript:parent.rechts.refreshresults(001);">001</a><br>
            <a href="javascript:parent.rechts.refreshresults(002);">002</a><br>
            <a href="javascript:parent.rechts.refreshresults(003);">003</a><br>
            -----------------------

            Den rechten frame ersetzt du  durch das prozesse.html (das ich dir verlinkt habe)

            Das prozesse.xsl sieht nun so aus:
            <?xml version="1.0" encoding="iso-8859-1"?>
            <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
            <xsl:param name="idparam"/>
            <xsl:template match="Prozesse">
             <div>
              ID: <xsl:value-of select="$idparam"/><br />
              Bereich: <xsl:value-of select="Prozess[@id = $idparam]/Bereich/text()"/><br />
              Verantwortlicher: <xsl:value-of select="Prozess[@id = $idparam]/Verantwortlicher/text()"/><br />
              Durchfuehrender: <xsl:value-of select="Prozess[@id = $idparam]/Durchfuehrender/text()"/><br />
              Daten<br />
              Eingang: <xsl:value-of select="Prozess[@id = $idparam]/Daten/Eingang/text()"/><br />
              Ausgang: <xsl:value-of select="Prozess[@id = $idparam]/Daten/Ausgang/text()"/><br />
             </div>
            </xsl:template>
            </xsl:stylesheet>

            Grüße
            Thomas

            1. Man man man, was du alles weißt. Das werde ich gleich morgen Testen. Danke nochmals für deine Hilfe. Ohne dich wäre ich wahrscheinlich schon Amok gelaufen oder aus dem Fenster gesprungen.
              Genial.

              Gruß
              realShadow

              1. Hallo,

                Man man man, was du alles weißt. Das werde ich gleich morgen Testen. Danke nochmals für deine Hilfe. Ohne dich wäre ich wahrscheinlich schon Amok gelaufen

                Bitte installiere aber vorher auf deinem Rechner paar Killeraplicationen! ;-þ

                Grüße
                Thomas

                PS: gern geschehen!

                1. Muss ich nicht verstehen oder? Killerap(p)licationen?

                  Gruß
                  realShadow

                  1. Hello out there!

                    Man man man, was du alles weißt.

                    Ja, Thomas versetzt auch mich immer wieder ins Staunen. ;-)

                    Ohne dich wäre ich wahrscheinlich schon Amok gelaufen
                    Muss ich nicht verstehen oder? Killerap(p)licationen?

                    Du sollst den Amoklauf nicht im RL tun.

                    See ya up the road,
                    Gunnar

                    --
                    „Wer Gründe anhört, kommt in Gefahr nachzugeben.“ (Goethe)
                    1. Hallo,

                      Ohne dich wäre ich wahrscheinlich schon Amok gelaufen
                      Muss ich nicht verstehen oder? Killerap(p)licationen?

                      Du sollst den Amoklauf nicht im RL tun.

                      Klar, natürlich nicht.
                      Und bevor er das nicht macht, soll er paar Killerspiele am Rechner installieren, damit dann jeder weiss, warum er es nicht gemacht hat[tm].

                      Grüße
                      Thomas