Mindgap: Erkennen des letzen Artikels

So, langsam aber sicher kommen wir zu den letzten Problemen :)

Die Situation:
Mit diesem Stück Code, werden Artikel aus den XML-Daten generiert:

<xsl:if test="Article/testelement[. = 'UPE']">
                         <a class="cap01" name="cap01"></a>
                         <a class="h2" href="http://www.www.de" target="_blank"><h2>ABC</h2></a>
                            <xsl:apply-templates select="Article" mode="upe" />
                            <div class="screenonly">
             <p class="backtotop" align="right"><a href="#top">Back to top</a></p></div>

<!-- do not touch this row -->
            <hr noshade="noshade"/>
                     </xsl:if>

Der Code
<div class="screenonly">
             <p class="backtotop" align="right"><a href="#top">Back to top</a></p></div>

<!-- do not touch this row -->
            <hr noshade="noshade"/>

erzeugt dabei immer eine horizontale Linie mit einem "Back to top" Buttom nach jedem Artikel.

Jetzt möchte ich aber, dass diese Linie beim allerletzten Artikel nicht generiert wird. Wie kann ich das anstellen? Mit einer einfachen If oder Choose Funktion komm ich da nicht weit. Wie kann ich es anstellen, dass das XSLT erkennt, welcher Artikel der letzte ist?

Vorschläge?

Gruß,
Mind

  1. Hi,

    hilft dir das eventuell weiter?

    http://www.zvon.org/xxl/XSLTutorial/Output_ger/example20_ch7.html

    Gruß,
    Thorsten F.

    1. Hi

      hilft dir das eventuell weiter?

      http://www.zvon.org/xxl/XSLTutorial/Output_ger/example20_ch7.html

      ja, die Richtung stimmt schonmal. Jedoch hat das Stylesheet

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

      <xsl:template match="list">
           <xsl:for-each select="entry">
                <xsl:value-of select="@name"/>
                <xsl:if test="not (position()=last())">
                     xsl:text, </xsl:text>
                </xsl:if>
           </xsl:for-each>
      </xsl:template>

      </xsl:stylesheet>

      einen entscheidenten Nachteil. Als letzter Artikel wird immer auch der letzte Artikel im XML-Quelltext angesprochen. In diesem Beispiel D

      <source>

      <list>
           <entry name="A"/>
           <entry name="B"/>
           <entry name="C"/>
           <entry name="D"/>
      </list>

      </source>

      Jedoch ist nicht zwangsläufig der letzten Artikel im XML Ausgangsdokument mit dem letzen Atikel im späteren HTML Dokument gleichzusetzen.

      Mein aktuelles XSLT poste ich der nächsten Antwort.

      1. Interessant sind bei meinem Problem die Artikel, die unter <!-- NORMALE TEXTE --> und <!-- ENDE NORMALE TEXTE --> beschrieben werden. Hier will ich immer den letzten Artikelblock, ohne Unterstrich publizieren (unabhängig der XML-Quelle).

        Danke, Mind

        <!-- Startvorlage -->

        <xsl:template match="/Documents">     <html>

        <head>         <title>Newsletter</title>                 <!-- IDs -->                     #printonly {display:none;}

        </style>

        </head>

        <body>

        <!-- ################ outer table, do not change -->         <p>&#160;</p>

        <!-- this table row is shown on screen only (screenonly) -->

        .                 .                 .

        <!-- ################# end of header -->

        <!-- ################# body -->               <!-- body table. do not edit table! -->               <table border="0" cellpadding="0" cellspacing="0" width="600" align="center" summary="">                 <tr>                   <td>

        <!-- this content is shown on screen only (screenonly), otherwise do not use the following <div> -->                     <!-- div not used: <div id="screenonly">-->                     <!-- ### this section contains the right hand tables, done via "float" ### -->

        <!-- SEITLICHE TEXTE -->                     <div class="float">

        <xsl:if test="Article/testelement[. = 'HT']">                         <fieldset style="border: 1px solid #999999; width: 100%">                           <legend style= "-10px"><h2>Hot Topics</h2></legend>                              <xsl:apply-templates select="Article" mode="ht"/>                         </fieldset>                       </xsl:if>

        <xsl:if test="Article/testelement[. = 'DM']">                         <fieldset style="border: 1px solid #999999; width: 100%">                           <legend style= "-10px"><h2>Don’t Miss</h2></legend>                             <xsl:apply-templates select="Article" mode="dm" />                         </fieldset>                       </xsl:if>

        </div>

        <!-- IVZ -->                      <div align="left">                        <form action="">                          <fieldset style= "border:1px solid #999999 width: 90% text-align: left">                            <legend style= "-10px"><h2>IT Practices Covered in This Edition</h2></legend>                            <ul class="edition">                              <xsl:if test="Article/testelement[. = 'UPE']">                                <li class="topic"><a href="#cap01">User Productivity Enablement</a></li>                              </xsl:if>

        <xsl:if test="Article/testelement[. = 'DU']">                                <li class="topic"><a href="#cap02">Data Unification</a></li>                              </xsl:if>

        </ul>                          </fieldset>                        </form>

        </div>

        <!-- NORMALE TEXTE -->                      <xsl:if test="Article/testelement[. = 'UPE']">                          <a class="cap01" name="cap01"></a>                          <a class="h2" href="http://bupmain.de" target="_blank"><h2>User Productivity</h2></a>                             <xsl:apply-templates select="Article" mode="upe" />                              <xsl:call-template name="upe_row"/>                      </xsl:if>

        <xsl:if test="Article/testelement[. = 'DU']">                         <a class="cap02" name="cap02"></a>                         <a class="h2" href="http://bupmain.de" target="_blank"><h2>Data</h2></a>                             <xsl:apply-templates select="Article" mode="du" />                             <xsl:apply-templates select="Article" mode="du_row" />                     </xsl:if>

        <!-- NORMALE TEXTE ENDE -->

        <!-- END OF MAIN CONTENT SECTION -->

        <br/>         </td>         </tr>         </table>

        <!-- end of body table -->         <!-- ################# end of body -->

        <!-- ################# footer -->

        <table border="0" width="100%" cellspacing="0" cellpadding="0" summary="">           <tr>             <td class="footnote" align="center"><br/>

        <hr noshade="noshade"/>&#169; Copyright 2007 TEST AG. All rights reserved.

        <!-- this blind paragraph secures enough space for anchors above. do not change! -->

        <p class="screenonly" style="line-height:700px;">&#160;</p>

        <!-- end of paragraph -->             </td>           </tr>         </table>

        <!-- ################ end of footer -->

        </td>         </tr>         </table>

        <!-- end outer table -->       </body>     </html>   </xsl:template>

        <!-- Startvorlage ende-->

        <!-- START Template Rules -->

        <!-- Right Hand Article -->

        <xsl:template match="Article" mode="ht" >                 xsl:choose                   <xsl:when test="testelement[. = 'HT']">                     <xsl:call-template name="ht"/>                   </xsl:when>                 </xsl:choose>             </xsl:template>

        <xsl:template match="Article" mode="dm" >               xsl:choose                 <xsl:when test="testelement[. = 'DM']">                   <xsl:call-template name="ht"/>                 </xsl:when>               </xsl:choose>             </xsl:template>

        <!-- END Right Hand Article -->

        <!-- START Main Topics -->             <xsl:template match="Article" mode="upe">                 xsl:choose                   <xsl:when test="testelement[. = 'UPE']">                     <xsl:call-template name="upe"/>                   </xsl:when>                 </xsl:choose>             </xsl:template>

        <xsl:template match="Article" mode="du">               xsl:choose                 <xsl:when test="testelement[. = 'DU']">                   <xsl:call-template name="du"/>                 </xsl:when>               </xsl:choose>             </xsl:template>

        <!-- END Main Topics -->

        <!-- START Rows -->

        <xsl:template match="Article" mode="upe_row">               xsl:choose                 <xsl:when test="testelement[. = 'DU' or . = 'BIM' or . = 'BEV' or . = 'ETEPI' or . = 'CD' or . = 'ULCM' or . = 'AM' or . = 'C' or . = 'ED']">                   <xsl:call-template name="upe_row"/>                 </xsl:when>               </xsl:choose>             </xsl:template>

        <xsl:template match="Article" mode="du_row">               xsl:choose                 <xsl:when test="testelement[. = 'BIM' or . = 'BEV' or . = 'ETEPI' or . = 'CD' or . = 'ULCM' or . = 'AM' or . = 'C' or . = 'ED']">                   <xsl:call-template name="du_row"/>                 </xsl:when>               </xsl:choose>             </xsl:template>

        </xsl:template>

        <!-- END Rows -->

        <!-- END Template Rules -->

        <!-- START Templates -->

        <!-- START Right Hand Article -->             <xsl:template name="ht">                 <ul style="">                   <li class="topic"><a target="_blank"><xsl:attribute name="href"><xsl:value-of select="link" /></xsl:attribute><xsl:value-of select="titel"/></a>                     <br/>                     <xsl:value-of select="abstract"/>                   </li>                 </ul>               <br/>             </xsl:template>

        <xsl:template name="dm">               <ul style="">                 <li class="topic"><a target="_blank"><xsl:attribute name="href"><xsl:value-of select="link" /></xsl:attribute><xsl:value-of select="titel"/></a>                   <br/>                   <xsl:value-of select="abstract"/>                 </li>               </ul>              <br/>             </xsl:template>       <!-- END Right Hand Article -->

        <!-- START Table of Contents -->

        <xsl:template name="ivzupe">               <li class="topic"><a href="#cap01">User Productivity Enablement</a></li>             </xsl:template>

        <!-- END Table of Contents -->

        <!-- START Main Topics -->

        <xsl:template name="upe">                 <h3><a target="_blank"><xsl:attribute name="href"><xsl:value-of select="link" /></xsl:attribute><xsl:value-of select="titel"/><xsl:value-of select="titel"/></a></h3>                 <p><xsl:value-of select="abstract"/></p>            </xsl:template>

        <xsl:template name="du">                 <h3><a target="_blank"><xsl:attribute name="href"><xsl:value-of select="link" /></xsl:attribute><xsl:value-of select="titel"/><xsl:value-of select="titel"/></a></h3>                 <p><xsl:value-of select="abstract"/></p>             </xsl:template>

        <!-- END Main Topics -->

        <!-- START Rows -->             <xsl:template name="upe_row">               <div class="screenonly">               <p class="backtotop" align="right"><a href="#top">Back to top</a></p></div>

        <!-- do not touch this row -->               <hr noshade="noshade"/>             </xsl:template>

        <xsl:template name="du_row">             <div class="screenonly">              <p class="backtotop" align="right"><a href="#top">Back to top</a></p></div>

        <!-- do not touch this row -->             <hr noshade="noshade"/>           </xsl:template>

        <!-- END Rows -->

        <!-- END Templates -->

        </xsl:stylesheet>

        1. Hallo,

          Ersten muss du deinen Kode echt bereinigen.
          Es ist mühsam, wenn man erstmal die vermeidbaren Fehler, wie die unmotiviert heurmstehende End-Tags, die nie geöffnet worden sind etc., beheben muss.

          Wie konntest du überhaupt mit dem Kode arbeiten, das er, so wie du ihn gepostet hast, nirgendwo funktionieren kann!?

          So, zu deiner Fragen:

          Im dem Teil:

          <xsl:if test="Article/testelement[. = 'UPE']">
           <a class="cap01" name="cap01" />
           <a class="h2" href="http://bupmain.de" target="_blank">
           <h2>User Productivity</h2>
           </a>
           <xsl:apply-templates select="Article" mode="upe" />
           <xsl:call-template name="upe_row" />
          </xsl:if>

          Übrigens, man packt keinen <h2> in einem <a>!

          Kannst du statt apply-templates und call templates jeweils ein for-each verwenden.
          Es hat so oder so nicht viel sinn ein konstrukt zu haben wie:
          <xsl:apply-templates select="Article" mode="upe" />
             <xsl:template match="Article" mode="upe">
           xsl:choose
              <xsl:when test="testelement[. = 'UPE']">
            <xsl:call-template name="upe" />

          Also:
          -------------------
          <xsl:if test="Article/testelement[. = 'UPE']">
           <a class="cap01" name="cap01"></a>
           <h2>
            <a class="h2" href="http://bupmain.de" target="_blank">User Productivity</a>
           </h2>
           <xsl:for-each select="Article[testelement[. = 'UPE']]">
            <h3>
             <a target="_blank" href="{link}">
              <xsl:value-of select="titel" />
             </a>
            </h3>
            <p>
             <xsl:value-of select="abstract" />
            </p>
            <div class="screenonly">
             <p class="backtotop" align="right">
              <a href="#top">Back to top</a>
             </p>
            </div>
            <xsl:if test="position() = last()">
             <hr noshade="noshade" />
            </xsl:if>
           </xsl:for-each>
          </xsl:if>
          ------------------

          Ähnlich dann für/unter: <xsl:if test="Article/testelement[. = 'DU']">

          Grüße
          Thomas

          1. Nabend,

            Ersten muss du deinen Kode echt bereinigen.
            Es ist mühsam, wenn man erstmal die vermeidbaren Fehler, wie die unmotiviert heurmstehende End-Tags, die nie geöffnet worden sind etc., beheben muss.

            Ja, ich musste den Kode sehr kürzen, damit er als Posting akzeptiert wird. Dabei sind mir Fehler unterlaufen.

            Übrigens, man packt keinen <h2> in einem <a>!

            Wenn ich das nicht mache, klappt die Formatierung über CSS nicht mehr?!

            Kannst du statt apply-templates und call templates jeweils ein for-each verwenden.
            Es hat so oder so nicht viel sinn ein konstrukt zu haben wie:
            <xsl:apply-templates select="Article" mode="upe" />
               <xsl:template match="Article" mode="upe">
            xsl:choose
                <xsl:when test="testelement[. = 'UPE']">
              <xsl:call-template name="upe" />

            Wieder was gelernt :)

            Vielen Dank für eure Hilfe. Ohne euch wär ich ziemlich verloren momentan...

            1. Hallo,

              Übrigens, man packt keinen <h2> in einem <a>!

              Wenn ich das nicht mache, klappt die Formatierung über CSS nicht mehr?!

              Das kann ich nicht wirklich nachvollziehen.

              Grüße
              Thomas

              1. Das kann ich nicht wirklich nachvollziehen.

                Ich auch leider nicht. Logisch ist deine Lösung mit <h2> außerhalb von <a href"">.

                Jedoch zeit der Browser mir immer die Falsche Formatierung an.

                CSS Eintrag ->

                <style media="screen" type="text/css">
                         xsl:comment
                          <!-- tag definitions -->
                          body {font-family:tahoma,helvetica,sans-serif; color:#333333; background-color:#ffffff;}
                          td {font-size:8.5pt; color:#333333;}
                          h2 {font-size:10pt; font-weight:600; margin-top:3px; margin-bottom:8px; color:#cc6600;}
                          h3 {font-size:8.5pt; font-weight:600; margin-bottom:-2px; margin-top:8px; color:#333333;}
                          p {margin-top:4px; margin-bottom:4px;}
                          b,strong {color:#444444; font-weight:600;}
                          i,em {color:#000000; font-style:italic;}
                          ul {list-style-type:square; margin-top:8px; margin-bottom:8px;}
                          ol {margin-top:8px; margin-bottom:8px;}
                          dl {margin-top:3px; margin-bottom:10px; font-size:7pt; color=#808080;}
                          li {color:#333333; margin-top:4px;}
                          hr {color:#999999; width:100%; height:1px;}
                          a {text-decoration:underline; color:#336699;}
                          a:visited {color:#001166;}
                          a:hover {text-decoration:none;}
                          <!-- classes -->
                          .marker {color:#000000; background-color:#ffff33; padding:0px;}
                          .edition {color:#999999; font-size:8pt; font-weight:600;}
                          .edition_red {color:#cc6600; font-size:8pt; font-weight:600;}
                          .footnote {color:#666666; font-size:8pt; font-weight:normal; margin-left:0px; margin-right:0px;}
                          .topic {font-size:8pt; color:#333333; margin-top:4px; margin-left:-15px; padding-right:2px;}
                          .backtotop {font-size:7pt; margin-top:3px; margin-bottom:-3px;}
                          .screenonly {display:inline;}
                          .h2 {color:#cc6600;}
                          .float {float:right; width:240px; padding-bottom:0px; margin-left:5px;}
                          <!-- IDs -->

                #printonly {display:none;}
                         </xsl:comment>
                        </style>

                <!-- end of "screen" -->

                1. Hallo,

                  Das kann ich nicht wirklich nachvollziehen.

                  Ich auch leider nicht. Logisch ist deine Lösung mit <h2> außerhalb von <a href"">.

                  Jedoch zeit der Browser mir immer die Falsche Formatierung an.

                  CSS Eintrag ->

                  <style media="screen" type="text/css">
                           xsl:comment

                  </xsl:comment>
                          </style>

                  Kein Wunder: duch das xsl:comment errreicht du folgenden Kode:

                  <style media="screen" type="text/css">
                   <!--
                       -->
                  </style>

                  Du kommentierts quasi dein CSS selbst aus.
                  Das xsl:comment ist nicht nötig, oder wenn du unbedingt "kommentiert" haben willst dann so:
                  <style media="screen" type="text/css">
                   <![CDATA[
                          /* tag definitions */
                   ]]>
                  </style>
                  (da muss du auf <!-- --> im CSS-Teil versichten, sonst steht das dann in der Ausgabe auch so)

                  Ansonsten weiß ich nicht, was die beabsichtigte Formatierung ist.
                  Auf dein <a> wiurken sich folgende Angaben aus:

                  h2 {
                    font-size: 10pt;
                    font-weight: 600;
                    margin-top: 3px;
                    margin-bottom: 8px;
                    color: #cc6600;
                  }

                  a {
                    text-decoration: underline;
                    color: #336699;
                  }

                  .h2 {
                   color: #cc6600;
                  }
                  a:hover {
                    text-decoration: none;
                  }

                  Grüße
                  Thomas

                  1. Hi,

                    Du kommentierts quasi dein CSS selbst aus.
                    Das xsl:comment ist nicht nötig, oder wenn du unbedingt "kommentiert" haben

                    Mensch, da hält man sich an ein Fachbch, und macht es trotzdem Falsch. Hier steht:

                    Interne CSS

                    "Für interne CSS benötigen wir zunächst einen Container, der aus dem style-Element gebildet wird. In diesem Element legen wir in HTML ein Kommentar mit den CSS Angaben. Diesen Kommentar wiederum erzeugen wir mit Hilfe des xsl:comment Elements." (Skulschus, Marco; Wiederstein Marcus "XSLT und XPath" mitp-Verlag)

                    1. Hallo,

                      Du kommentierts quasi dein CSS selbst aus.
                      Das xsl:comment ist nicht nötig, oder wenn du unbedingt "kommentiert" haben

                      Mensch, da hält man sich an ein Fachbch, und macht es trotzdem Falsch. Hier steht:

                      Interne CSS

                      "Für interne CSS benötigen wir zunächst einen Container, der aus dem style-Element gebildet wird. "

                      So weit ist das korrekt.

                      "In diesem Element legen wir in HTML ein Kommentar mit den CSS Angaben. Diesen Kommentar wiederum erzeugen wir mit Hilfe des xsl:comment Elements."

                      Das war mal, als man für _ältere_ Browser die CSS-Angaben auf diese Weise Versteckte. Ist mittlerweile (gute 4-5 Jahre) ganz überflüssig. Zudem ist generell Fehleranfällig, wenn du z.B. auch im CSS-Teil etwas mit XSL generierst. Da du dann mehere xsl:comment brauchst, was sich dann eben mit tollen HTML-Kommentaren mitten im CSS zeigt.
                      In Verbindung von XML/XSLT und mit der Verbreitung von XHTML ist das noch "schlimmer": beachte dazu die Erklärungen unter http://de.selfhtml.org/html/xhtml/unterschiede.htm#script_style

                      Entweder du lagerst dein CSS gleich in eine eigene Datei aus, was das beste ist. Oder du lässt xsl:comment weg, oder verwendest eben <![CDATA[ ]]>.

                      Grüße
                      Thomas

                      1. "In diesem Element legen wir in HTML ein Kommentar mit den CSS Angaben. Diesen Kommentar wiederum erzeugen wir mit Hilfe des xsl:comment Elements."

                        Das war mal, als man für _ältere_ Browser die CSS-Angaben auf diese Weise Versteckte. Ist mittlerweile (gute 4-5 Jahre) ganz überflüssig. Zudem ist generell Fehleranfällig, wenn du z.B. auch im CSS-Teil etwas mit XSL generierst. Da du dann mehere xsl:comment brauchst, was sich dann eben mit tollen HTML-Kommentaren mitten im CSS zeigt.

                        Das Buch ist Jahrgang 2005. Da sollte man doch denken, dass da sowas aktualisiert ist. Naja.

          2. Leider unterliegt dem Coding ein kleiner Verständnisfehler.

            Ich hab ihn mal umgeschrieben:

            <xsl:if test="Article/testelement[. = 'UPE']">
                                  <a class="cap01" name="cap01"></a>
                                  <h2>
                                    <a class="h2" href="http://bupmain.wdf.sap.corp:1080/socoview(bD1kZSZjPTAwMSZkPW1pbg==)/smdisplay.asp?id=004F8486F21E4522943507897144041B&amp;fragID=004F8486F21E4522943507897144041B&amp;packageid=ABF7F9F0F3ED284BB302D37BB7F8575D&amp;iv=" target="_blank">User Productivity</a>
                                  </h2>
                                  <xsl:for-each select="Article[testelement[. = 'UPE']]">
                                    <h3><a target="_blank"><xsl:attribute name="href"><xsl:value-of select="link" /></xsl:attribute><xsl:value-of select="titel"/><xsl:value-of select="titel"/></a></h3>
                                    <p>
                                      <xsl:value-of select="abstract"/>
                                    </p>
                                    <xsl:if test="position() = last()">
                                      <div class="screenonly">
                                        <p class="backtotop" align="right">
                                          <a href="#top">Back to top</a>
                                        </p>
                                      </div>

            <hr noshade="noshade" />
                                    </xsl:if>
                                  </xsl:for-each>
                                </xsl:if>

            Der Newsletter besteht ja aus mehreren solcher <if> Container. Jedoch soll es möglich sein, dass im letzten <if> Container die horinzontale Linie ( <hr noshade="noshade" /> ) nicht angezeigt wird. Das <div class="screenonly"> Element jedoch schon.

            Wie bekomme ich das in den Griff?

            Gruß,
            Michael

            1. Hallo,

              Leider unterliegt dem Coding ein kleiner Verständnisfehler.

              Ich hab ihn mal umgeschrieben:

              <xsl:if test="position() = last()">
                                        <div class="screenonly">
                                          <p class="backtotop" align="right">
                                            <a href="#top">Back to top</a>
                                          </p>
                                        </div>

              <hr noshade="noshade" />
                                      </xsl:if>
                                    </xsl:for-each>
                                  </xsl:if>

              Der Newsletter besteht ja aus mehreren solcher <if> Container. Jedoch soll es möglich sein, dass im letzten <if> Container die horinzontale Linie ( <hr noshade="noshade" /> ) nicht angezeigt wird. Das <div class="screenonly"> Element jedoch schon.

              Wie bekomme ich das in den Griff?

              Du meinst also:
              1. if: <xsl:if test="Article/testelement[. = 'UPE']">
              in diesem soll immer sreenonly und <hr> angezeigt werden
              2. if: <xsl:if test="Article/testelement[. = 'DU']">
              auch in diesem soll immer sreenonly und <hr> angezeigt werden
              ...
              x. if: ....
              in diesem soll zwar screenonly aber nicht <hr> angezeigt werden.

              Dann muss du die pos=last Abfrage nur in dem letzen if einfügen.

              Wenn ich das jetzt falsch verstanden habe:
              statt <xsl:if test="position() = last()"> ein choose-when test=position() = last()" einfügen darin den, was angezeigt werden soll und im otherwise das, was eben im anderen Fall da stehen soll.

              Grüße
              Thomas

              1. Du meinst also:

                1. if: <xsl:if test="Article/testelement[. = 'UPE']">
                  in diesem soll immer sreenonly und <hr> angezeigt werden
                2. if: <xsl:if test="Article/testelement[. = 'DU']">
                  auch in diesem soll immer sreenonly und <hr> angezeigt werden
                  ...
                  x. if: ....
                  in diesem soll zwar screenonly aber nicht <hr> angezeigt werden.

                Ja, zu 90% haben wir es. Aber noch nicht ganz. Das Element

                1. if: <xsl:if test="Article/testelement[. = 'UPE']">

                besteht ja aus mehreren Artikeln. Der Aufbau nur von UPE sieht also so aus:

                ---------------------------------------------
                !  User Productivity Enablement                                   !
                !                                                                                  !
                !  Artikelüberschrift Nummer 1                                    !
                !  Artikeltext zu Nummer 1                                          !
                !                                                                                  !
                !  Artikelüberschrift Nummer 1                                    !
                !  Artikeltext zu Nummer 1                Back to top         !
                ! ----------------------------------------        !
                !                                                                                  !
                ----------------------------------------------

                Kommen jetzt noch mehrere Kapitel, wie z.B. DU und ABC hinzu, sieht der Newsletter so aus:

                ---------------------------------------------
                !  User Productivity Enablement                                   !
                !                                                                                  !
                !  Artikelüberschrift Nummer 1                                    !
                !  Artikeltext zu Nummer 1                                          !
                !                                                                                  !
                !  Artikelüberschrift Nummer 1                                    !
                !  Artikeltext zu Nummer 1                Back to top         !
                ! ----------------------------------------        !
                !                                                                                  !
                ----------------------------------------------

                ---------------------------------------------
                !  Data Unification                                                       !
                !                                                                                  !
                !  Artikelüberschrift Nummer 1                                    !
                !  Artikeltext zu Nummer 1                                          !
                !                                                                                  !
                !  Artikelüberschrift Nummer 1                                    !
                !  Artikeltext zu Nummer 1                Back to top         !
                ! ----------------------------------------        !
                !                                                                                  !
                ----------------------------------------------

                ---------------------------------------------
                !  ABC                                                                          !
                !                                                                                  !
                !  Artikelüberschrift Nummer 1                                    !
                !  Artikeltext zu Nummer 1                                          !
                !                                                                                  !
                !  Artikelüberschrift Nummer 1                                    !
                !  Artikeltext zu Nummer 1                Back to top         !
                ! ----------------------------------------        !
                !                                                                                  !
                ----------------------------------------------

                Da aber am unteren Ende des Newsletters eine weitere Linie als unteres Rahmenelement ist, würde ich gerne immer die Linie unter "Back to top" beim jeweils letzten Kapitel ausblenden. Ein Beispiel:

                ---------------------------------------------
                !  User Productivity Enablement                                   !
                !                                                                                  !
                !  Artikelüberschrift Nummer 1                                    !
                !  Artikeltext zu Nummer 1                                          !
                !                                                                                  !
                !  Artikelüberschrift Nummer 1                                    !
                !  Artikeltext zu Nummer 1                Back to top         !
                ! ----------------------------------------        !
                !                                                                                  !
                ----------------------------------------------

                ---------------------------------------------
                !  Data Unification                                                       !
                !                                                                                  !
                !  Artikelüberschrift Nummer 1                                    !
                !  Artikeltext zu Nummer 1                                          !
                !                                                                                  !
                !  Artikelüberschrift Nummer 1                                    !
                !  Artikeltext zu Nummer 1                Back to top         !
                ! ----------------------------------------        !
                !                                                                                  !
                ----------------------------------------------

                ---------------------------------------------
                !  ABC                                                                          !
                !                                                                                  !
                !  Artikelüberschrift Nummer 1                                    !
                !  Artikeltext zu Nummer 1                                          !
                !                                                                                  !
                !  Artikelüberschrift Nummer 1                                    !
                !  Artikeltext zu Nummer 1                Back to top         !
                !                                                                                  !
                !                                                                                  !
                ----------------------------------------------

                Hier ist also die Linie unter "Back to top" ausgeblendet. Würden im Newsletter vielleicht nur UPE und DU vorkommen, müsste die Linie unter "Back to top" im DU Kapitel weg, da dieses Kapitel ja nun das Letzte darstellt.

                ---------------------------------------------
                !  User Productivity Enablement                                   !
                !                                                                                  !
                !  Artikelüberschrift Nummer 1                                    !
                !  Artikeltext zu Nummer 1                                          !
                !                                                                                  !
                !  Artikelüberschrift Nummer 1                                    !
                !  Artikeltext zu Nummer 1                Back to top         !
                ! ----------------------------------------        !
                !                                                                                  !
                ----------------------------------------------

                ---------------------------------------------
                !  Data Unification                                                       !
                !                                                                                  !
                !  Artikelüberschrift Nummer 1                                    !
                !  Artikeltext zu Nummer 1                                          !
                !                                                                                  !
                !  Artikelüberschrift Nummer 1                                    !
                !  Artikeltext zu Nummer 1                Back to top         !
                !                                                                                  !
                !                                                                                  !
                ----------------------------------------------

                Der Code sieht jetzt folgendermaßen aus:

                <xsl:if test="Article/testelement[. = 'DU']">
                                      <a class="cap02" name="cap02"></a>
                                      <h2>
                                      <a class="h2" href="http://bupmain.wdf.sap.corp:1080/socoview(bD1kZSZjPTAwMSZkPW1pbg==)/smdisplay.asp?id=004F8486F21E4522943507897144041B&amp;fragID=004F8486F21E4522943507897144041B&amp;packageid=ABF7F9F0F3ED284BB302D37BB7F8575D&amp;iv=" target="_blank">Data Unification</a>
                                      </h2>
                                      <xsl:for-each select="Article[testelement[. = 'DU']]">
                                        <h3>
                                          <a target="_blank">
                                            <xsl:attribute name="href">
                                              <xsl:value-of select="link" />
                                            </xsl:attribute>
                                            <xsl:value-of select="titel"/>

                </a>
                                        </h3>
                                        <p>
                                          <xsl:value-of select="abstract"/>
                                        </p>
                                        <xsl:if test="position() = last()">
                                          <div class="screenonly">
                                            <p class="backtotop" align="right">
                                              <a href="#top">Back to top</a>
                                            </p>
                                          </div>
                                          <hr noshade="noshade" />
                                        </xsl:if>
                                      </xsl:for-each>
                                    </xsl:if>

                1. Hallo,

                  Du meinst also:

                  1. if: <xsl:if test="Article/testelement[. = 'UPE']">
                    in diesem soll immer sreenonly und <hr> angezeigt werden
                  2. if: <xsl:if test="Article/testelement[. = 'DU']">
                    auch in diesem soll immer sreenonly und <hr> angezeigt werden
                    ...
                    x. if: ....
                    in diesem soll zwar screenonly aber nicht <hr> angezeigt werden.

                  Ja, zu 90% haben wir es. Aber noch nicht ganz. Das Element

                  Ich verstehe.
                  In dem Fall hilf du, wenn du überpfüst ob eine nächste "Gruppe" von Artikel gibt. Also im:

                  <xsl:if test="Article/testelement[. = 'DU']">
                   ...
                  <xsl:for-each select="Article[testelement[. = 'DU']]">
                     ...
                     <xsl:if test="position() = last()">
                        <div class="screenonly">
                           <p class="backtotop" align="right">
                              <a href="#top">Back to top</a>
                           </p>
                         </div>
                     </xsl:if>
                  </xsl:for-each>

                  <!-- hier jetzt die Abfrage für die nächste Gruppe -->
                    <xsl:if test="//Article[testelement[. = 'DU']]">
                       <hr noshade="noshade" />
                     </xsl:if>
                  </xsl:if>

                  Diese Afrage dann in djeden if einbauen und immer natürlich auf die nächste Gruppe prüfen.

                  Aber ... du wirst mich hasse dafür ;-) ...
                  Da du jetzt alle XMLs quasi in einer Datei hast, gäbe es weitaus bessere und effizientere Möglichkeiten für die Gruppierung und das dann mit nur einem Template. Sortieren z.B. nach dem ABC oder nach einem nummerischen Kriterum kann man auch.

                  z.B.
                  <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
                     <xsl:key name="topics" match="Article" use="testelement"/>

                  Und dann statt die Bisherige if-Abfragen einfach:
                  ------------
                  <xsl:for-each select="Article[generate-id() = generate-id(key('topics', testelement)[1])]">
                   <xsl:sort select="testelement" />
                   <a class="cap0{position()}" name="cap0{position()}" />
                   <h2>
                   <!-- <a class="h2" href="http://bupmain.de" target="_blank">User Productivity</a> -->
                   </h2>
                   <xsl:for-each select="key('topics', testelement)">
                    <h3>
                     <a target="_blank" href="{link}">
                      <xsl:value-of select="titel" />
                     </a>
                    </h3>
                    <p>
                     <xsl:value-of select="abstract" />
                    </p>
                    <div class="screenonly">
                     <p class="backtotop" align="right">
                      <a href="#top">Back to top</a>
                     </p>
                    </div>
                   </xsl:for-each>
                   <xsl:if test="not(position() = last())">
                    <hr noshade="noshade" />
                   </xsl:if>
                  </xsl:for-each>
                  ---------------

                  Beim auskommentierten <a> kannst du etwas ausgeben, was du aus dem Article heruaslesen kannst, oder du kannst eine Reihe von when-Abfragen machen:
                  --------------
                  <xsl:for-each select="Article[generate-id() = generate-id(key('topics', testelement)[1])]">
                     <xsl:variable name="t" select="testelement" />
                     <xsl:sort select="testelement" />
                   <a class="cap0{position()}" name="cap0{position()}" />
                  xsl:choose
                     <xsl:when test="$t = 'UPE'">            <a class="h2" href="..." target="_blank">User Productivity</a>
                     </xsl:when>
                     <xsl:when test="$t = 'HT'">
                        <a class="h2" href="" target="_blank">HT ... </a>
                      </xsl:when>
                     ...
                  </xsl:choose>

                  ... der Rest wie Oben ...
                  --------------

                  Wenn allerdings die Reihenfolge (also z.B. UPE, ABC, DU) fest vorgeben ist, geht das nicht so gut.

                  Grüße
                  Thomas

                  1. Ok, super. Das Teil rennt jetzt wie geplant.

                    Danke Thomas!

                    PS: Kann man mit dir anderweitig Kontakt aufnehmen (via Mail oder Messanger?)

                    Gruß,
                    Michael

                    1. Hallo,

                      Ok, super. Das Teil rennt jetzt wie geplant.

                      Danke Thomas!

                      Gern geschehen.

                      PS: Kann man mit dir anderweitig Kontakt aufnehmen (via Mail oder Messanger?)

                      In jedem meiner Posting ist meine Mailadresse drinn ;-)

                      Grüße
                      Thomas