Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   XML (https://www.delphipraxis.net/46-xml/)
-   -   Delphi Knoten filtern über Checkboxen in XML Datei (https://www.delphipraxis.net/68729-knoten-filtern-ueber-checkboxen-xml-datei.html)

Luckie 4. Mai 2006 10:05


Knoten filtern über Checkboxen in XML Datei
 
Liste der Anhänge anzeigen (Anzahl: 2)
Ich habe eine XML Datei und dazu passend eine xsl Datei. In der XML Datei wird eine Tabelle dargestellt:
Code:
Kategorie | Zeitstempel | Text
Kategorien sind: Info, Debug, Task, Warning und Error.

Könnte man jetzt irgendwie Checkboxen einfügen, so dass man sich aussuchen kann, welche Kategorien angezeigt werden sollen? Wichtig: es muss ohne irgendwelche serverseitigen Web-Sprachen gehen, da das Programm lokal auf einem Rechner läuft und die Datei lokal betrachtet wird.

Ich habe die Dateien mal angehangen.

marabu 4. Mai 2006 11:39

Re: Knoten filtern über Checkboxen in XML Datei
 
Hallo Michael,

du machst es dir leichter, wenn du in deinem XSL-T Script ein paar Änderungen machst:

Dein CSS-Skript kannst du extern speichern:

XML-Code:
...
<head>
  <link rel="stylesheet" type="text/css" href="logfile.css"/>
  <title>...
Das Filter-Template würde ich so schreiben:

XML-Code:

<xsl:template name="luckie">
Jetzt kannst du über den Namen darauf zugreifen und die Filter vor der Verwendung einspeisen:

Delphi-Quellcode:
procedure TDemoForm.DemoButtonClick(Sender: TObject);
var
  s: TStrings;
  dir, fnDocument, fnStyle: TFileName;
begin
  dir := 'c:\daten\dp\luckie\';
  fnDocument := dir + 'logfile.xml';
  fnStyle := ChangeFileExt(fnDocument, '.xsl');
  s := TStringList.Create;
  xmlDoc.load(fnDocument);
  xmlStyle.load(fnStyle);

  s.Add('Start');
  s.Add('Ende');
  s.Delimiter := '|';

  with xmlStyle.selectSingleNode('//*[@name="luckie"]') as IXMLDOMElement do
    setAttribute('match', s.DelimitedText);
  s.Text := xmlDoc.transformNode(xmlStyle);
  s.SaveToFile('c:\daten\dp\luckie\logtest.html');
  s.Free;
end;
Grüße vom marabu

Luckie 4. Mai 2006 11:50

Re: Knoten filtern über Checkboxen in XML Datei
 
Hm, nein. Man soll auch die Möglichkeit haben zu filtern, wenn man die Datei schon im Browser geöffnet hat. Es müsste wohl irgendwie mit JavaScript oder so gehen.

MathiasSimmack 4. Mai 2006 19:20

Re: Knoten filtern über Checkboxen in XML Datei
 
Ich schicke dir mal meinen Schichtplan, dann stellst du solche Fragen, wenn ich daheim bin. :stupid:
Also, hier erst mal eine Notlösung (muss gleich pennen, habe morgen Frühschicht :cry:):

XML-Code:
<xsl:template match="log">
  <html>
  <head>
     

     <script type="text/javascript"><![CDATA[
     
        function toggle(obj)
        {
           cb = document.getElementById(obj + "_cb");
           if (cb == null) return;
           
           cells = document.getElementsByTagName("TR");
           for (i = 0; i < cells.length - 1; i++)
           {
              if (cells[i].getAttribute("id") == obj)
              {
                 cells[i].style.display = (cb.checked)?"":"none";
              }
           }
        }
     
     ]]></script>
  </head>
  <body>
     <input type="checkbox" id="Debug_cb" checked="checked" onclick="toggle('Debug');"/> Debug


     <input type="checkbox" id="Info_cb" checked="checked" onclick="toggle('Info');"/> Informationen


     <input type="checkbox" id="Task_cb" checked="checked" onclick="toggle('Task');"/> Aufgaben


     <input type="checkbox" id="Warning_cb" checked="checked" onclick="toggle('Warning');"/> Warnungen


     <input type="checkbox" id="Error_cb" checked="checked" onclick="toggle('Error');"/> Fehler




     
</xsl:template>


<xsl:template match="Info|Task|Error|Warning|Debug|Hint|Start|Ende">
   <tr>
      <xsl:attribute name="class">
         
      </xsl:attribute>



      <xsl:attribute name="id"><xsl:value-of select="name()"/></xsl:attribute>



      <td><xsl:value-of select="name()"/></td>
      <td><xsl:value-of select="@TS"/></td>
      <td><xsl:apply-templates /></td>
   </tr>
</xsl:template>
Wie du hoffentlich siehst, habe ich ein weiteres Attribut ("id") für jede Tabellenzeile (tr) erstellt, dass als Inhalt den Namen der Aktion bekommt (Info, Warning, usw.). Oben in der HTML-Seite sind entsprechende Checkboxen ergänzt, die auch den Namen tragen (mit "_cb"-Postfix).
Klickst du eine Checkbox an, dann toggelt das Skript los: Es ermittelt den Status der gewählten Checkbox, sucht sich dann alle Tabellenzeilen und schaltet die auf sichtbar oder unsichtbar.

Bisher aufgetretenes Problem: Wenn du eine Box abwählst und die Seite per F5 neu lädtst, dann baut sich der XML-Code komplett auf, aber die Box bleibt abgewählt. In dem Fall musst du 2x klicken, um die unerwünschten Infos zu verbergen. Wenn dir das reicht, soll es mir recht sein. ;)

Luckie 4. Mai 2006 21:20

Re: Knoten filtern über Checkboxen in XML Datei
 
Mir persönlich würde es eventuell reichen, aber für den Kunden muss es perfekt sein. Könntest du das mal anhängen?

cruiser 5. Mai 2006 05:33

Re: Knoten filtern über Checkboxen in XML Datei
 
Liste der Anhänge anzeigen (Anzahl: 1)
Zur Funktion oben noch eine Deklarieren:

XML-Code:
function toggleall()
{
  toggle('Debug');
  toggle('Info');
  toggle('Task');
  toggle('Warning');
  toggle('Error');
}
Und dann den body-Tag beim laden mit der function bestücken:

XML-Code:
<body onload="toggleall();">
Müsste eigentlich hinhaun, IE6 macht es... FireFox hat sich zickig. Da müsst man dann wohl noch die Select-States für den reload übergeben... :gruebel: sooo tief steck ich in js aber nich drinne.

Ich hab die Änderungen von MathiasSimmack und mir mal reingebastelt. Download unten

Luckie 5. Mai 2006 11:21

Re: Knoten filtern über Checkboxen in XML Datei
 
Danke, ich habe mich nämlich irgendwo immer verhauen und bnon dann ganz verloren gegenagen. :roll:

MathiasSimmack 5. Mai 2006 15:01

Re: Knoten filtern über Checkboxen in XML Datei
 
Warum auch immer, aber die Lösung von cruiser hat bei mir nicht funktioniert. Die Idee war aber gut, also habe ich die "toggleall"-Funktion kurzerhand so geändert:
Code:
function toggleall()
{
   cbs = document.getElementsByTagName("INPUT");
   for (i = 0; i <= cbs.length - 1; i++)
   {
      if (cbs[i] != null) cbs[i].checked = true;
   }
}
und dann machen bei mir IE6 und Firefox 1.5.0.3 das Gewünschte. Ich war zwar immer der Meinung, die Zählweise fängt bei Null an und endet demzufolge auch bei "length - 1", aber dann hat er in meiner Datei nie die letzte Checkbox Fehler berücksichtigt. Mit o.g. Variante, die eigentlich von 0 bis "length" läuft, geht es dann. :gruebel:


Perfekt genug, Luckie? :zwinker:

cruiser 5. Mai 2006 15:11

Re: Knoten filtern über Checkboxen in XML Datei
 
Wie gesagt... ich steck sooo tief nich in js :stupid:

Bei mir klappets im FireFox auch nich... beim Reload werden auch die boxen neu gesetzt. :wall:

Und IE schluckts auch nich mehr :twisted: Reload und der vergisst, wie die Boxen gesetzt waren

Edit: Oder hast du irgendwo erweitert?

Luckie 5. Mai 2006 15:20

Re: Knoten filtern über Checkboxen in XML Datei
 
Besten Dank ihr beiden. :thumb:


Alle Zeitangaben in WEZ +1. Es ist jetzt 23:24 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz