Thomas J.S.: XML Daten anzeigen (die 3.)

Beitrag lesen

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