Stefan: Suchfunktion in XSL einbinden mit JAVASCRIPT

Guten Morgen,

ich habe ein XML-Dokument und mittels XSL beschreibe ich das XML.
Ich habe es auch so gemacht, dass ich einzelne Knoten im XML auf und zu klappen kann! Das ist ein Auszug aus dem XSL!
Code:
  <script language="JavaScript">
function doMenu(dieID)
   {
      var e=document.getElementById(dieID);
       if(e.style.display=="none")
        e.style.display="block";
      else
     e.style.display="none";
    }

</script>

Jetzt meine Frage, wenn ich im Internet Explorer etwas suche, was in dem XML steht, findet er es nicht, da die Blöcke(Knoten) noch nicht aufgeklappt sind! Wie kann ich in meinem XSL-Skript eine Suchfunktion einbinden, damit er auch das findet, was noch nicht aufgeklappt ist?
Funktioniert so eine Suchroutine mit Java-Skript und wenn ja wie?
Habe bisher noch keine Erfahrung mit Javascript.
Hoffe es kann mir jemand helfen!

Gruß Stefan

  1. Guten Morgen,

    ich habe ein XML-Dokument und mittels XSL beschreibe ich das XML.
    Ich habe es auch so gemacht, dass ich einzelne Knoten im XML auf und zu klappen kann! Das ist ein Auszug aus dem XSL!
    Code:
      <script language="JavaScript">
    function doMenu(dieID)
       {
          var e=document.getElementById(dieID);
           if(e.style.display=="none")
            e.style.display="block";
          else
         e.style.display="none";
        }

    </script>

    Jetzt meine Frage, wenn ich im Internet Explorer etwas suche, was in dem XML steht, findet er es nicht, da die Blöcke(Knoten) noch nicht aufgeklappt sind! Wie kann ich in meinem XSL-Skript eine Suchfunktion einbinden, damit er auch das findet, was noch nicht aufgeklappt ist?
    Funktioniert so eine Suchroutine mit Java-Skript und wenn ja wie?
    Habe bisher noch keine Erfahrung mit Javascript.
    Hoffe es kann mir jemand helfen!

    Gruß Stefan

    Ich hatte noch vergessen, dass ich auf meiner XML-Seite ein Button haben will und ein Textfeld, wo ich das Wort dann eingeben kann! Wie funktioniert das in der Kombination mit Javascript?

    Gruß Stefan

  2. Guten Morgen,

    hallo

    ich habe ein XML-Dokument und mittels XSL beschreibe ich das XML.

    du kannst mit xsl das xml dokument parsen (umwandeln), um dann daraus ein html-dokument zu machen aber beschreiben geht nicht.

    Ich habe es auch so gemacht, dass ich einzelne Knoten im XML auf und zu klappen kann!

    das kann mein browser auch so :-)

    Das ist ein Auszug aus dem XSL!
    Code:

    für mich sieht das aus wie javascript, welches normalerweise in html dokumenten steht.

    <script language="JavaScript">

    nimm das attribut type anstatt language.

    function doMenu(dieID)
       {
       [...]
        }

    </script>
    Jetzt meine Frage, [...]

    ich glaube, du solltest dich erstmal mit den grundlegenden dingen von xml und xsl beschäftigen. zum suchen benutzt du doch sicherlich die suchfunktion (strg+f) des ie oder? die kannst du nicht beeinflussen.

    Ich hatte noch vergessen, dass ich auf meiner XML-Seite ein
    Button haben will

    das geht nicht.

    wie gesagt, beschäftige dich mit den grundlegenden dingen von xml und xsl, dann kommst du sehr schnell dahinter was wie von deinen fragen funktioniert.

    cu
    ulli

    1. Hallo,
      na gut, vielleicht habe ich mich nicht so genau ausgedrückt!
      Also ich habe ein XML-Dokument und mit einem XSL-Stylesheet parse ich es um in HTML!
      So sieht es aus!
      CODE:

      <?xml version="1.0" encoding="ISO-8859-1"?>                Festgelegtes Encoding von W3, muss bei jedem XML-->
      <xsl:stylesheet version="1.0"
        xmlns:xsl="http://www.w3.org/1999/XSL/Transform">

      <xsl:template match="Hauptknoten">

      <html>

      <head>
        <script type="text/javascript">
      function doMenu(dieID)
          {
             var e=document.getElementById(dieID);
            if(e.style.display=="none")
              e.style.display="block";
            else
           e.style.display="none";
          }
        </script>                                              </head>

      <body>
         <p style="font-weight:bold">Hauptknoten-Start</p>

      <xsl:apply-templates select="Blockstart" />
         <p style="font-weight:bold">Hauptknoten-Ende</p>

      </body>

      </html>
       </xsl:template>
      <xsl:template match="Blockstart">
      <div style="margin-left:20px; margin-right:20px; padding-left:10px;">

      <p style="font-weight:bold; font-size:80%">
         <xsl:attribute name="onClick">                                  doMenu('block<xsl:number level="any" />')                         </xsl:attribute>
         <span>+
                                                                                                                                      <xsl:apply-templates select="line[@qualifier='000001:0']" />
      <xsl:apply-templates select="line[@qualifier='000001:15']" />
      <xsl:apply-templates select="line[@qualifier='000001:16']" />
      <xsl:apply-templates select="line[@qualifier='000001:2']" />
      <xsl:apply-templates select="line[@qualifier='000001:21']" />
      </span></p>

      <p>
            <spanstyle="display:none">                                                <!-- Blöcke werden auf unsichtbar gesetzt-->
            <xsl:attribute name="id">block<xsl:number level="any" /></xsl:attribute>   <!-- Alle Blöcke bekommem eine ID, damit sie verschachtelt dargestellt werden-->
            <xsl:apply-templates select="./*" />                                       <!--An dieser Stelle wird der Inhalt des aktuellen Tags eingesetzt,der Punkt ist ein Kürzel für den aktuellen "Standort". -->
            </span>
         </p>

      </div>
      </xsl:template>

      <xsl:template match="line">                                               <!-- Die Line-Templates beginne hier-->
         FEHLENDE BESCHREIBUNG!!!!!: <xsl:value-of select="." /><br />
      </xsl:template>

      <xsl:template match="line[@qualifier='000001:0']">                       <!-- Um neue Daten einzufügen, einfach, die-->
        Start File: <xsl:value-of select="." /><br />                          <!-- 6 stellige Zahl einfügen, und den passenden-->
      </xsl:template>

      </xsl:stylesheet>                                                       <!-- Ende des Stylesheet -->

      Guten Morgen,
      hallo
      ich habe ein XML-Dokument und mittels XSL beschreibe ich das XML.
      du kannst mit xsl das xml dokument parsen (umwandeln), um dann daraus ein html-dokument zu machen aber beschreiben geht nicht.
      Ich habe es auch so gemacht, dass ich einzelne Knoten im XML auf und zu klappen kann!
      das kann mein browser auch so :-)
      Das ist ein Auszug aus dem XSL!
      Code:
      für mich sieht das aus wie javascript, welches normalerweise in html dokumenten steht.
        <script language="JavaScript">
      nimm das attribut type anstatt language.
      function doMenu(dieID)
         {
         [...]
          }

      </script>
      Jetzt meine Frage, [...]
      ich glaube, du solltest dich erstmal mit den grundlegenden dingen von xml und xsl beschäftigen. zum suchen benutzt du doch sicherlich die suchfunktion (strg+f) des ie oder? die kannst du nicht beeinflussen.

      Die will ich ja auch nicht beeinflußen, sondern eine neue mit Javascript schreiben, weiß halt nur nicht wie es geht!
      Wie ich schon bei dem Ausgangsproblem geschildert habe!

      Ich hatte noch vergessen, dass ich auf meiner XML-Seite ein
      Button haben will
      das geht nicht.

      Glaube schon dass es geht!

      wie gesagt, beschäftige dich mit den grundlegenden dingen von xml und xsl, dann kommst du sehr schnell dahinter was wie von deinen fragen funktioniert.

      Das habe ich schon, hatte mich halt nur schlecht ausgedrückt!

      Gruß Stefan

      1. Hallo,

        na gut, vielleicht habe ich mich nicht so genau ausgedrückt!

        Ein wenig ;-)

        Also ich habe ein XML-Dokument und mit einem XSL-Stylesheet parse ich es um in HTML!

        Ich weiss ich bin pingelig: es heißt transformieren; parsen bedeutet nur das einlesen der Quelldokument in dem RAM und und die Überprüfung der XML-Regel für Wohlgeformtheit.

        <?xml version="1.0" encoding="ISO-8859-1"?>                Festgelegtes Encoding von W3, muss bei jedem XML-->

        Es muss nicht sein, die XML-Deklaration ist optional,

        <xsl:template match="Hauptknoten">

        Ich würde entweder einen Template für den Wurzelknoten schreiben:
        <xsl:template match="/">
          <html>
           <head> ...
           <body>
             <xsl:apply-templates />
           </body
          </html>
        </xsl:template>

        oder es so machen:
        <xsl:template match="/Hauptknoten">

        <xsl:template match="Blockstart">
        <div style="margin-left:20px; margin-right:20px; padding-left:10px;">

        <p style="font-weight:bold; font-size:80%">
           <xsl:attribute name="onClick">                                  doMenu('block<xsl:number level="any" />')                         </xsl:attribute>

        Es wäre besser, wenn du hier nicht <p> nehmen würdest sondern <div>
        Tipp: du könntest hier auch die Funktion generate-id() verwenden.

        <spanstyle="display:none">
               ^^^^^^
        Tippfehler? <span style="display:none">
                                                   <!-- Blöcke werden auf unsichtbar gesetzt-->

        Wenn es Blöcke sein sollten, wärst du mit <div> besser dran.

        <xsl:attribute name="id">block<xsl:number level="any" /></xsl:attribute>   <!-- Alle Blöcke bekommem eine ID, damit sie verschachtelt dargestellt werden-->

        Tipp: du könntest hier auch die Funktion generate-id() verwenden.
        <span id="{generate-id()}"> ...

        <xsl:apply-templates select="./*" />                                       <!--An dieser Stelle wird der Inhalt des aktuellen Tags eingesetzt,der Punkt ist ein Kürzel für den aktuellen "Standort". -->

        Nicht ganz!
        Was du hier machst ist folgendes:
        <xsl:apply-templates select="self::node()/child::*" /> !

        1. Der Punkt ist die Abkürzung für self::node().
        2. Also du ruft die Templates nicht für den aktuellen Element (für Tags gibt es so oder so keinen Template) sonder für jedes Kindelemt in deinem gegenwärtigen Knoten.
          War / ist das dein Absicht?

        Es fehlt noch dein XML um mehr dazu sagen zu können.

        Grüße
        Thomas

        1. Hallo,

          na gut, vielleicht habe ich mich nicht so genau ausgedrückt!

          Ein wenig ;-)

          Ok, ich bin ja auch noch ein kleiner Azubi, vielleicht ändert sich das ja mal mit den Jahren :-)

          Also ich habe ein XML-Dokument und mit einem XSL-Stylesheet parse ich es um in HTML!

          Ich weiss ich bin pingelig: es heißt transformieren; parsen bedeutet nur das einlesen der Quelldokument in dem RAM und und die Überprüfung der XML-Regel für Wohlgeformtheit.

          <?xml version="1.0" encoding="ISO-8859-1"?>                Festgelegtes Encoding von W3, muss bei jedem XML-->

          Es muss nicht sein, die XML-Deklaration ist optional,

          <xsl:template match="Hauptknoten">

          Ich würde entweder einen Template für den Wurzelknoten schreiben:
          <xsl:template match="/">
            <html>
             <head> ...
             <body>
               <xsl:apply-templates />
             </body
            </html>
          </xsl:template>

          oder es so machen:
          <xsl:template match="/Hauptknoten">

          <xsl:template match="Blockstart">
          <div style="margin-left:20px; margin-right:20px; padding-left:10px;">

          <p style="font-weight:bold; font-size:80%">
             <xsl:attribute name="onClick">                                  doMenu('block<xsl:number level="any" />')                         </xsl:attribute>

          Es wäre besser, wenn du hier nicht <p> nehmen würdest sondern <div>
          Tipp: du könntest hier auch die Funktion generate-id() verwenden.

          <spanstyle="display:none">
                 ^^^^^^
          Tippfehler? <span style="display:none">
                                                     <!-- Blöcke werden auf unsichtbar gesetzt-->

          Wenn es Blöcke sein sollten, wärst du mit <div> besser dran.

          <xsl:attribute name="id">block<xsl:number level="any" /></xsl:attribute>   <!-- Alle Blöcke bekommem eine ID, damit sie verschachtelt dargestellt werden-->

          Tipp: du könntest hier auch die Funktion generate-id() verwenden.
          <span id="{generate-id()}"> ...

          <xsl:apply-templates select="./*" />                                       <!--An dieser Stelle wird der Inhalt des aktuellen Tags eingesetzt,der Punkt ist ein Kürzel für den aktuellen "Standort". -->

          Nicht ganz!
          Was du hier machst ist folgendes:
          <xsl:apply-templates select="self::node()/child::*" /> !

          1. Der Punkt ist die Abkürzung für self::node().
          2. Also du ruft die Templates nicht für den aktuellen Element (für Tags gibt es so oder so keinen Template) sonder für jedes Kindelemt in deinem gegenwärtigen Knoten.
            War / ist das dein Absicht?

          Ja das ist Absich.

          Es fehlt noch dein XML um mehr dazu sagen zu können.

          Ok, Thomas oder wer es sonst noch liest, das XSL was ich habe funktioniert bereits schon, aber trotzdem danke für die Hilfe.
          Mein Problem ist ja wie schon gesagt, dass ich eine Suchfunktion haben will und die ich mittel Javascript, was ich nicht kann, in das XSL einbinden will, damit ich dann "einfach" ein Textfeld habe, da denn Text eingebe und ich nur noch auf den Button drücken muss und dann mein XML durchsucht wird, welches ich vorher mit dem XSL-Stylesheet transformiere, auch wenn die Knoten auf unsichtbar stehen!

          Hier noch ein kleiner Auszug aus dem XML, bevor ich es mittels XSL transformiert habe:

          • <Hauptknoten>
          • <Blockstart ID="0">
              <line qualifier="000001:0">0</line>
              <line qualifier="000100">1015</line>
              <line qualifier="000101">1</line>
              <line qualifier="000102">0</line>
              <line qualifier="000103">45</line>
              <line qualifier="000104">12:29:39</line>
              <line qualifier="000105">2003-03-03</line>
              <line qualifier="000106">2003-03-03 12:29:39</line>
              <line qualifier="000107">ANSI</line>
              <line qualifier="000112">TEst.exe</line>
              <line qualifier="000113">Rel56</line>
          • <Blockstart ID="21">
              <line qualifier="000001:21">21</line>
          • <Blockstart ID="15">

          Und so sieht es dann das XML mit dem XSL aus
          Hauptknoten-Start

          Blockstart-Beginn

          Start File: 0
          Text1: 1015
          Text2: 1
          Text3 0
          Text4: 45
          Text5: 12:29:39
          Text6: 2003-03-03
          Text7: 2003-03-03 12:29:39
          Text8: ANSI
          Text9: TEst.exe
          Text10: Rel56

          Blockstart-Beginn

          Text11: 21

          So geht das noch lange weiter!
          Wenn ich nun mit dem IE nach 1015 zum Beispiel suche findet er es nicht, weil ja mein Knoten nicht aufgeklappt ist, d.h. er ist unsichtbar, wegen dem XSL.
          Vielleicht versteht man mich jetzt besser!

          Gruß Stefan

          1. Hallo Stefan,

            Bitte nicht immer alles in deiner Antwort zirieren.

            Mein Problem ist ja wie schon gesagt, dass ich eine Suchfunktion haben will und die ich mittel Javascript, was ich nicht kann, in das XSL einbinden will, damit ich dann "einfach" ein Textfeld habe, da denn Text eingebe und ich nur noch auf den Button drücken muss und dann mein XML durchsucht wird, welches ich vorher mit dem XSL-Stylesheet transformiere, auch wenn die Knoten auf unsichtbar stehen!

            So geht das noch lange weiter!
            Wenn ich nun mit dem IE nach 1015 zum Beispiel suche findet er es nicht, weil ja mein Knoten nicht aufgeklappt ist, d.h. er ist unsichtbar, wegen dem XSL.
            Vielleicht versteht man mich jetzt besser!

            Jetzt verstehe ich was du meinst.
            Dein Problem ist aber nicht XSL oder XML, sonder lediglich HTML und JavaScript.
            Komm für eine kurze Zeit weg von dem Gedanken XML/XSL: wenn du deinen Javascript ausführen willst, ist die XML/XSL -Transformation bereits abgeschlossen, d.h. du arbeitest nur noch mit HTML.
            Also es wird nicht dein XML sonder das produzierte HTML durchgesucht.

            Da du schienbar mit dem IE arbeitest, würde ich dir empfehlen, dass du dir http://download.microsoft.com/download/d/6/9/d69f1a03-7aab-4f6d-9c9b-3c30e8744086/iexmltls.exe istalliert:
            Nach der Installation (du musst msxmlvw.inf ausführen) kannst du im Browser (Kontextmenü-->View XSL Output) den generierten HTML-Quelltext ansehen. Ohne dieses Tool siehst du immer nur den Code des XML-Quelldokuments, (denke dass du deshalb immer wieder über XML durchsuchen sprichst).
            Dann kannst du auch mit dem generierten HTML arbeiten.

            Leider werde ich dir beim JavaScrit nicht helfen können, aber im Prizip müsstest du in etwa folgendes tun:
            Du müsstest in jedem Element mit "id=block+n" nach dem Text suchen und wenn der gefunden wurde, den Style des elements auf display:block setzen.

            Dein HTML schaut etwas so aus:
            In diesem kannst du ja erst mal versuchen deine Suche zu erstellen, wenn sie dann funktioniert, ist es leicht den JavaSCript in deinem XSL-Sheet zu überführen.

            Güße
            Thomas

            <html>
               <head>
                  <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
                  <title></title>
               <script type="text/javascript">
                  function doMenu(dieID) {
                   var e=document.getElementById(dieID);
                    if(e.style.display=="none")
                     e.style.display="block";
                    else
                     e.style.display="none";
                  }
              </script>
             </head>
               <body>
              <form name="suchform" action="">
               <input type="text" size="20" name="suchtext" value="">
               <input type="button" onclick="this.form.submit()" value="suche">
              </form>
              <p style="font-weight:bold">Hauptknoten-Start</p>
              <div style="margin-left:20px;margin-right:20px;padding-left:10px;">
               <p style="font-weight:bold;font-size:80%;cursor:hand;" onClick="doMenu('block1')">
                <span>+ Start File: 0<br></span>
               </p>
               <p>
                <span style="display:none" id="block1">
                 Start File: 0<br>
                 FEHLENDE BESCHREIBUNG!!!!!: 1015<br>
                 FEHLENDE BESCHREIBUNG!!!!!: 1<br>
                 FEHLENDE BESCHREIBUNG!!!!!: 0<br>
                 FEHLENDE BESCHREIBUNG!!!!!: 45<br>
                 FEHLENDE BESCHREIBUNG!!!!!: 12:29:39<br>
                 FEHLENDE BESCHREIBUNG!!!!!: 2003-03-03<br>
                 FEHLENDE BESCHREIBUNG!!!!!: 2003-03-03 12:29:39<br>
                 FEHLENDE BESCHREIBUNG!!!!!: ANSI<br>
                 FEHLENDE BESCHREIBUNG!!!!!: TEst.exe<br>
                 FEHLENDE BESCHREIBUNG!!!!!: Rel56<br>
                </span>
               </p>
              </div>
              <div style="margin-left:20px;margin-right:20px;padding-left:10px;">
               <p style="font-weight:bold;font-size:80%;cursor:hand;" onClick="doMenu('block2')">
                <span>+ FEHLENDE BESCHREIBUNG!!!!!: 21<br></span>
               </p>
               <p>
                <span style="display:none" id="block2">
                 FEHLENDE BESCHREIBUNG!!!!!: 21<br>
                </span>
               </p>
              </div>
                  <p style="font-weight:bold">Hauptknoten-Ende</p>
               </body>
            </html>

            1. Hallo Thomas,

              Bitte nicht immer alles in deiner Antwort zirieren.

              Werde ich machen!

              Vielen dank für die Hilfe, werde es mal versuchen!

              Gruß Stefan

  3. Hallo,

    ich habe ein XML-Dokument und mittels XSL beschreibe ich das XML.

    Bitte nicht böse sein, wenn ich dich hier ausbessere. Du kannst mit XSL keine XML-Dokumente beschreiben. Du kannst sie höchtens in ein anderes Format (ob XML, HTML, etc) transformieren.

    Ich habe es auch so gemacht, dass ich einzelne Knoten im XML auf und zu klappen kann! Das ist ein Auszug aus dem XSL!

    Das geht schlicht und einfach nicht.
    Es gibt in XML selbst keine Scripting.

    Was meinst du also bitte genau?

    Jetzt meine Frage, wenn ich im Internet Explorer etwas suche, was in dem XML steht, findet er es nicht, da die Blöcke(Knoten) noch nicht aufgeklappt sind!

    Er wird es auch nicht finden, wie gesagt in XML selbst gibt es keine Scripting.

    »»Wie kann ich in meinem XSL-Skript eine Suchfunktion einbinden,

    Du meinst  in deinem JavaScript?

    Funktioniert so eine Suchroutine mit Java-Skript und wenn ja wie?

    Nein, weil in XML selbst keine Scripting gibt.

    »»Ich hatte noch vergessen, dass ich auf meiner XML-Seite ein Button haben will und ein Textfeld, wo ich das Wort dann eingeben kann! Wie funktioniert das in der Kombination mit Javascript?

    Gar nicht, weil es in XML auch keine Buttons gibt.

    Ich bitte dich deine Fragen nochmal zu überlegen und dich vielleicht vorher mit den Begriffen wie XML / XSL / HTML / JavaScript etwas genauer auseinanderzusetzen, dnen so wie du jetzt deine Fragen gestellt hast, können wir dir leider nicht helfen, weil wir dein Sprach und Begriffsgebrauch einfach nicht verstehen und so nciht nachvollziehen können was du meinst.

    Grüße
    Thomas