XML Daten anzeigen (die 3.)
realShadow
- xml
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
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
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
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
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:
Grüße
Thomas
Hallo Thomas,
zu deinen Fragen:
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
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:
Gruß
realShadow
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
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
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!
Muss ich nicht verstehen oder? Killerap(p)licationen?
Gruß
realShadow
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
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