ilja: schleife

wie bilde ich eine schleife!

da meine XML datei mit einen programm generiert wird, kommen die gleichen zeilen, nur mit anderen zahlen. hier ein beispiel:

<COMPUTER>
<Linie Liniennummer="1" Slave="1">
<Freigabe>-1</Freigabe>
<Name>Linie1</Name>
<AdressRegeln>
 <Freigabe>0</Freigabe>
 <Linie>0xf000</Linie>
 <Station>0x0f00</Station>
 <Baugruppe>0x00f0</Baugruppe>
 <XZ>0x000f</XZ>
</AdressRegeln>
</Linie>
<Linie Liniennummer="0" Slave="2">
<Freigabe>0</Freigabe>
<Name>Linie2</Name>
<AdressRegeln>
 <Freigabe>1</Freigabe>
 <Linie>04560</Linie>
 <Station>0xzu670</Station>
 <Baugruppe>fghfd55</Baugruppe>
 <XZ>dfg5t</XZ>
</AdressRegeln>
</Linie>
</COMPUTER>

wie man sieht hier unter
<Linie Liniennummer="1" Slave="1">
und
<Linie Liniennummer="0" Slave="2">
sehen anders aus und in den <AdressRegeln> von beiden, auch andere daten.

diese erste z.b.

<Linie Liniennummer="1" Slave="1">
<Freigabe>-1</Freigabe>
<Name>Linie1</Name>
<AdressRegeln>
 <Freigabe>0</Freigabe>
 <Linie>0xf000</Linie>
 <Station>0x0f00</Station>
 <Baugruppe>0x00f0</Baugruppe>
 <XZ>0x000f</XZ>
</AdressRegeln>
</Linie>

fuer die mache ich inm der XSL eine tabelle! so.. und nun wenn in der XML datei noch eine dazu kommt.. zum beispiel  diese:

<Linie Liniennummer="0" Slave="2">
<Freigabe>0</Freigabe>
<Name>Linie2</Name>
<AdressRegeln>
 <Freigabe>1</Freigabe>
 <Linie>04560</Linie>
 <Station>0xzu670</Station>
 <Baugruppe>fghfd55</Baugruppe>
 <XZ>dfg5t</XZ>
</AdressRegeln>
</Linie>

wie kann ich es via XSL (in IE) anzeigen lassen, ohne, dass ich die XSL datei noch mal bearbeiten muss, also neue tabelle usw. einrichten muss?

danke,
ilja

  1. Hallo,

    wie bilde ich eine schleife!

    wie kann ich es via XSL (in IE) anzeigen lassen, ohne, dass ich die XSL datei noch mal bearbeiten muss, also neue tabelle usw. einrichten muss?

    In XSLT gibt es im Sinne wie in Programmiersprachen keine Schleifen.

    Ich habe es nicht genau verstanden was du möchtest: wenn es dir nur darum geht, dass du für jedes <Linie>-Element eine Tabelle erzeugen möchtest, dann geht es einfach mit einem Template.

    <xsl:template match="Linie">
    <!-- hier dine angaben für das Template -->
    </xsl:template>

    Da kannst dann dieses Template an der Stelle mit <xsl:apply-templates select="" /> in deinem XSLT-Sheet aufrufen, wo später die Tabellen ausgegeben werden sollen.
    Das Template wird dann für jedes vorkommende <Linie>-Element aufgerufen.

    Die andere Möglichkeit ist, wenn du mit xsl:for-each arbeitest, dann z.B. wenn du für das <COMPUTER>-Element ein Template erstellt hast:

    <xsl:template match="COMPUTER">
    <!-- diverse Angaben -->

    <xsl:for-each select="Linie">
        <!-- hier dine angaben für das Element-->
       </xsl:for-each>

    <!-- diverse andere Angaben -->
    </xsl:template>

    In diesem Fall werden die Angaben im xsl:for-each ebenfalls für jedes <Linie>-Element erneut ausgeführt.

    Grüße
    Thomas

    1. hmm.. werde dies so aenlich ausprobieren, und wenn ich z.B. sowas habe <a href="javascript:ToggleDetails('0')"><img src="images/expand.gif" border="0" id="FrontImg_0" align="absmiddle"/>

      diesen ToggleDetails('0') und id="FrontImg_0"

      die NULLen muessen z.b. erweitert werden bei jeder tabelle um eins.

      mfg,
      ilja

      Hallo,

      wie bilde ich eine schleife!

      wie kann ich es via XSL (in IE) anzeigen lassen, ohne, dass ich die XSL datei noch mal bearbeiten muss, also neue tabelle usw. einrichten muss?

      In XSLT gibt es im Sinne wie in Programmiersprachen keine Schleifen.

      Ich habe es nicht genau verstanden was du möchtest: wenn es dir nur darum geht, dass du für jedes <Linie>-Element eine Tabelle erzeugen möchtest, dann geht es einfach mit einem Template.

      <xsl:template match="Linie">
      <!-- hier dine angaben für das Template -->
      </xsl:template>

      Da kannst dann dieses Template an der Stelle mit <xsl:apply-templates select="" /> in deinem XSLT-Sheet aufrufen, wo später die Tabellen ausgegeben werden sollen.
      Das Template wird dann für jedes vorkommende <Linie>-Element aufgerufen.

      Die andere Möglichkeit ist, wenn du mit xsl:for-each arbeitest, dann z.B. wenn du für das <COMPUTER>-Element ein Template erstellt hast:

      <xsl:template match="COMPUTER">
      <!-- diverse Angaben -->

      <xsl:for-each select="Linie">
          <!-- hier dine angaben für das Element-->
         </xsl:for-each>

      <!-- diverse andere Angaben -->
      </xsl:template>

      In diesem Fall werden die Angaben im xsl:for-each ebenfalls für jedes <Linie>-Element erneut ausgeführt.

      Grüße
      Thomas

      1. Hallo,

        hmm.. werde dies so aenlich ausprobieren, und wenn ich z.B. sowas habe <a href="javascript:ToggleDetails('0')"><img src="images/expand.gif" border="0" id="FrontImg_0" align="absmiddle"/>

        diesen ToggleDetails('0') und id="FrontImg_0"

        die NULLen muessen z.b. erweitert werden bei jeder tabelle um eins.

        War das jetzt eine Frage? ;-)

        Du kannst einfach die generate-id()-Funktion in deinem Template verwenden:

        <xsl:template match="Linie">
        <!-- diverse Angaben -->
         <a href="javascript:ToggleDetails('{generate-id()}')"><img src="images/expand.gif" border="0" id="{concat('FrontImg_', generate-id())}" align="absmiddle"/>
        </xsl:template>

        In diesem Fall wird für jedes <Linie>-Element automatisch eine eigene ID erzeugt. Dann muss du nichts erhöhen und jedes entsprechende Element in deinem HTML hat eine korrekte ID.

        Wenn die Nummer wegen der Bilder doch erhöht werden muss: dann gebe statt einer generierte ID die Position des Elements aus:

        <xsl:template match="Linie">
        <!-- diverse Angaben -->
         <a href="javascript:ToggleDetails('{position()}')"><img src="images/expand.gif" border="0" id="{concat('FrontImg_', position())}" align="absmiddle"/>
        </xsl:template>

        Allerdings XSLT beginnt mit bei 1 und nicht bei 0 zu zählen.

        Grüße
        Thomas

        1. hmm... funktioniert nicht so richtig. mache ich da was falsch?

          so sieht eine von denen jetzt aus:

          <xsl:for-each select="FtpConnection">

          <table class="tborder" cellSpacing="1" width="100%" align="center" border="0">
              <tr>
            <td class="alt2" ondblclick="ToggleDetails('1')" style="CURSOR: pointer; PADDING-RIGHT: 3px; PADDING-LEFT: 3px; PADDING-BOTTOM: 3px; PADDING-TOP: 3px; BORDER-BOTTOM: 1px outset" align="left">
            <a href="javascript:ToggleDetails('1')"><img src="images/expand.gif" border="0" id="FrontImg_1" align="absmiddle"/></a>
            <b>FtpConnection</b>
            </td>
              </tr>
              <tr id="FrontRow_1" style="display:none">
                <td><table  cellSpacing="1" cellPadding="3" width="100%" align="center" border="0">
                    <tr>
                      <td class="alt1" width="10%"><b>IpAdresse</b></td>
                      <td class="alt2"><xsl:value-of select="IpAdresse"/></td>
                    </tr>
                    <tr>
                      <td class="alt1"><b>UserName</b></td>
                      <td class="alt2"><xsl:value-of select="UserName"/></td>
                    </tr>
                    <tr>
                      <td class="alt1"><b>Passwort</b></td>
                      <td class="alt2"><xsl:value-of select="Passwort"/></td>
                    </tr>
                </table></td>
              </tr>
          </table>

          </xsl:for-each>

          nach deiner beschreibung habe ich dies so gemacht:

          <xsl:for-each select="FtpConnection">
          <xsl:template match="FtpConnection">

          <table class="tborder" cellSpacing="1" width="100%" align="center" border="0">
              <tr>
            <td class="alt2" ondblclick="ToggleDetails('{generate-id()}')" style="CURSOR: pointer; PADDING-RIGHT: 3px; PADDING-LEFT: 3px; PADDING-BOTTOM: 3px; PADDING-TOP: 3px; BORDER-BOTTOM: 1px outset" align="left">
            <a href="javascript:ToggleDetails('{generate-id()}')"><img src="images/expand.gif" border="0" id="{concat('FrontImg_', generate-id())}" align="absmiddle"/></a>
            <b>FtpConnection</b>
            </td>
              </tr>
              <tr id="{concat('FrontRow_', generate-id())}" style="display:none">
                <td><table  cellSpacing="1" cellPadding="3" width="100%" align="center" border="0">
                    <tr>
                      <td class="alt1" width="10%"><b>IpAdresse</b></td>
                      <td class="alt2"><xsl:value-of select="IpAdresse"/></td>
                    </tr>
                    <tr>
                      <td class="alt1"><b>UserName</b></td>
                      <td class="alt2"><xsl:value-of select="UserName"/></td>
                    </tr>
                    <tr>
                      <td class="alt1"><b>Passwort</b></td>
                      <td class="alt2"><xsl:value-of select="Passwort"/></td>
                    </tr>
                </table></td>
              </tr>
          </table>

          </xsl:template>
          </xsl:for-each>

          ist da was flasch?
          danke,
          ilja

          Hallo,

          hmm.. werde dies so aenlich ausprobieren, und wenn ich z.B. sowas habe <a href="javascript:ToggleDetails('0')"><img src="images/expand.gif" border="0" id="FrontImg_0" align="absmiddle"/>

          diesen ToggleDetails('0') und id="FrontImg_0"

          die NULLen muessen z.b. erweitert werden bei jeder tabelle um eins.

          War das jetzt eine Frage? ;-)

          Du kannst einfach die generate-id()-Funktion in deinem Template verwenden:

          <xsl:template match="Linie">
          <!-- diverse Angaben -->
           <a href="javascript:ToggleDetails('{generate-id()}')"><img src="images/expand.gif" border="0" id="{concat('FrontImg_', generate-id())}" align="absmiddle"/>
          </xsl:template>

          In diesem Fall wird für jedes <Linie>-Element automatisch eine eigene ID erzeugt. Dann muss du nichts erhöhen und jedes entsprechende Element in deinem HTML hat eine korrekte ID.

          Wenn die Nummer wegen der Bilder doch erhöht werden muss: dann gebe statt einer generierte ID die Position des Elements aus:

          <xsl:template match="Linie">
          <!-- diverse Angaben -->
           <a href="javascript:ToggleDetails('{position()}')"><img src="images/expand.gif" border="0" id="{concat('FrontImg_', position())}" align="absmiddle"/>
          </xsl:template>

          Allerdings XSLT beginnt mit bei 1 und nicht bei 0 zu zählen.

          Grüße
          Thomas

          1. Hallo,

            so sieht eine von denen jetzt aus:

            <xsl:for-each select="FtpConnection">

            [...]

            <td class="alt2" ondblclick="ToggleDetails('1')"

            [...]

            </xsl:for-each>

            Damit wird für jedes <FtpConnection>-Element daselbe erzeugt: d.h. es wird immer ein »»ondblclick="ToggleDetails('1')"«« im <td> stehen.

            nach deiner beschreibung habe ich dies so gemacht:

            <xsl:for-each select="FtpConnection">
            <xsl:template match="FtpConnection">

            </xsl:template>
            </xsl:for-each>

            ist da was flasch?

            Ja, ;-)
            In deinem Fall heisst es: entweder xsl:for-each oder xsl:template.
            Entferne <xsl:template match="FtpConnection"> so:

            <xsl:for-each select="FtpConnection">
            <!-- hier die Tabelle -->
            </xsl:for-each>

            dann sollte es gehen. Wenn es noch immer nicht klappt, muss du dein XSL zeigen, denn ohne den zu kennen, ist weitere Hilfe leider nicht mehr möglich.

            Grüße
            Thomas

            1. da ist noch eine datei in die XSL datei impotiert (<script src="js/functions.inc.js" language="jscript" type="text/javascript"></script>)

              kann ich am besten als zip alle dateien ihnen per e-mail zu schicken?

              danke,
              ilja

              Hallo,

              so sieht eine von denen jetzt aus:

              <xsl:for-each select="FtpConnection">
              [...]
                <td class="alt2" ondblclick="ToggleDetails('1')"
              [...]
              </xsl:for-each>

              Damit wird für jedes <FtpConnection>-Element daselbe erzeugt: d.h. es wird immer ein »»ondblclick="ToggleDetails('1')"«« im <td> stehen.

              nach deiner beschreibung habe ich dies so gemacht:

              <xsl:for-each select="FtpConnection">
              <xsl:template match="FtpConnection">

              </xsl:template>
              </xsl:for-each>

              ist da was flasch?

              Ja, ;-)
              In deinem Fall heisst es: entweder xsl:for-each oder xsl:template.
              Entferne <xsl:template match="FtpConnection"> so:

              <xsl:for-each select="FtpConnection">
              <!-- hier die Tabelle -->
              </xsl:for-each>

              dann sollte es gehen. Wenn es noch immer nicht klappt, muss du dein XSL zeigen, denn ohne den zu kennen, ist weitere Hilfe leider nicht mehr möglich.

              Grüße
              Thomas

              1. es geht jetzt ich musste in den header dies hier benutzen

                <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">

                und nicht den <xsl:stylesheet xmlns:xsl="http://www.w3.org/TR/WD-xsl">

                danke Thomas!

                ilja

                da ist noch eine datei in die XSL datei impotiert (<script src="js/functions.inc.js" language="jscript" type="text/javascript"></script>)

                kann ich am besten als zip alle dateien ihnen per e-mail zu schicken?

                danke,
                ilja

                Hallo,

                so sieht eine von denen jetzt aus:

                <xsl:for-each select="FtpConnection">
                [...]
                  <td class="alt2" ondblclick="ToggleDetails('1')"
                [...]
                </xsl:for-each>

                Damit wird für jedes <FtpConnection>-Element daselbe erzeugt: d.h. es wird immer ein »»ondblclick="ToggleDetails('1')"«« im <td> stehen.

                nach deiner beschreibung habe ich dies so gemacht:

                <xsl:for-each select="FtpConnection">
                <xsl:template match="FtpConnection">

                </xsl:template>
                </xsl:for-each>

                ist da was flasch?

                Ja, ;-)
                In deinem Fall heisst es: entweder xsl:for-each oder xsl:template.
                Entferne <xsl:template match="FtpConnection"> so:

                <xsl:for-each select="FtpConnection">
                <!-- hier die Tabelle -->
                </xsl:for-each>

                dann sollte es gehen. Wenn es noch immer nicht klappt, muss du dein XSL zeigen, denn ohne den zu kennen, ist weitere Hilfe leider nicht mehr möglich.

                Grüße
                Thomas

                1. Hallo,

                  es geht jetzt ich musste in den header dies hier benutzen

                  und nicht den <xsl:stylesheet xmlns:xsl="http://www.w3.org/TR/WD-xsl">

                  Das ist ein sehr sehr alter Microsoft-Syntax, wo noch weder die Spezifikation noch der XSLT-Prozessor von M$ ausgereift waren.

                  danke Thomas!

                  Gern geschehen.

                  Grüße
                  Thomas