Polarbear: HTML in XSL, Verschachtelte Templates

Hallo Gemeinde,

der Inhalt des folgenden XML

<?xml version="1.0" encoding="utf-8" ?>
<docs>
 <row title="Titel a" teaser="Teaser AAAAA" imgsrc="a.gif" />
 <row title="Titel b" teaser="Teaser CCCCC" imgsrc="b.gif" />
 <row title="Titel c" teaser="Teaser BBBBB" imgsrc="c.gif" />
</docs>

soll via XSLT so ausgegeben werden:

<html><body>
 <table border="1">
   <tr><td colspan="2"><b>Titel a</b></td></tr>
   <tr>
   <td valign="top"><img src="a.gif"></td>
   <td>
    Teaser AAAAA<br><br>
    Titel b<br>
    Titel c
   </td>
  </tr>
 <table>
</body></html>

Dabei handelt es sich um drei Artikel, von denen der erste vollständig angeteasert wird und auf die restlichen Artikel nur mittels des Titels verwiesen wird.

Problem: Im XSLT gibt es eine Verschachtelung von Element mit position() = 1 (Vollständig angeteasert) und den folgenden Elementen für die position() > 1 gilt:

<?xml version="1.0" encoding="UTF-8" ?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
 <xsl:output method="html" />

<xsl:template match="//docs">
  <div style="border:1px solid red">
   <xsl:apply-templates select="row"/>
  </div>
 </xsl:template>

<xsl:template match="docs/row[position() = 1]">
  <table border="1">
    <tr><td colspan="2"><b><xsl:value-of select="@title"/></b></td></tr>
    <tr>
    <td valign="top"><img src="{@imgsrc}"/></td>
    <td>
     <xsl:value-of select="@teaser"/><br/><br/>
     <xsl:apply-templates select="row"/> <!-- ??????  -->
    </td>
   </tr>
  </table>
 </xsl:template>

<xsl:template match="docs/row[position() > 1]">
  <xsl:value-of select="@title"/><br/>
 </xsl:template>

</xsl:stylesheet>

Wie kann das unterste template in das andere unter den genannten Bedingungen eingefügt werden? Gerne auch ganz andere Ansätze !

Dank und Gruss
Polarbear

  1. Hallo,

    Ich würde es wie folgt versuchen, siehe unten

    <?xml version="1.0" encoding="UTF-8" ?>
    <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:output method="html" />

    <xsl:template match="//docs">
      <div style="border:1px solid red">
       <xsl:apply-templates select="row"/>
      </div>
    </xsl:template>

    <xsl:template match="docs/row[position() = 1]">
      <table border="1">
        <tr><td colspan="2"><b><xsl:value-of select="@title"/></b></td></tr>
        <tr>
        <td valign="top"><img src="{@imgsrc}"/></td>
        <td>
         <xsl:value-of select="@teaser"/><br/><br/>
         <xsl:apply-templates select="row"/> <!-- ??????  -->

    <xsl:call-templates select="row2-x"/>

    </td>
       </tr>
      </table>
    </xsl:template>

    <xsl:template match="docs/row[position() > 1]">

    <xsl:template name="row2-x">
         <xsl:for-each select="docs/row[position() > 1]">
         ..........

    <xsl:value-of select="@title"/><br/>
    </xsl:template>

    </xsl:stylesheet>

    bydey

    --
    -- noch immer ein erfolgloser <DIV> Jünger --
    1. Hallo,

      <xsl:template match="docs/row[position() > 1]">
          <xsl:template name="row2-x">
      </xsl:template>

      Das kann nicht funktionieren.

      Grüße
      Thomas

      --
      Surftip: kennen Sie schon Pipolino's Clowntheater?
      http://www.clowntheater-pipolino.net/
  2. Hallo,

    Wie kann das unterste template in das andere unter den genannten Bedingungen eingefügt werden? Gerne auch ganz andere Ansätze !

    <xsl:template match="docs/row">
      <table border="1">
        <tr><td colspan="2"><b><xsl:value-of select="@title"/></b></td></tr>
        <tr>
        <td valign="top"><img src="{@imgsrc}"/></td>
        <td>
      <xsl:if test="position() = 1">
       <xsl:value-of select="@teaser"/>
      </xsl:if>
      <br/><br/>
        </td>
       </tr>
      </table>
     </xsl:template>

    @title hast du ja bei allen und es schaut eigentlich komisch aus, wenn du dann unter dem Titel nochmals den Titel schreibst (bei rows die position() > 1 haben).

    Grüße
    Thomas

    ps: ansonsten kannst du ja eine choose --> when/otherweise im Template schreiben.

    --
    Surftip: kennen Sie schon Pipolino's Clowntheater?
    http://www.clowntheater-pipolino.net/
    1. Hallo Thomas.

      <td colspan="2"><b><xsl:value-of select="@title"/></b></td></tr>

      Bietet sich hier nicht das th-Element an?

      Einen schönen Sonntag noch.

      Gruß, Ashura

      --
      Selfcode: sh:( fo:} ch:? rl:( br: n4:~ ie:{ mo:| va:) de:> zu:) fl:( ss:) ls:[ js:|
      30 Days to becoming an Opera8 Lover -- Opera Mini on Treo
      Meine Browser: Opera 8.02 | Firefox 1.0.6 | Lynx 2.8.5 | Netscape 4.7 | IE 6.0
      [Deshalb frei! - Argumente pro freie Software]
      1. Hallo,

        <td colspan="2"><b><xsl:value-of select="@title"/></b></td></tr>

        Bietet sich hier nicht das th-Element an?

        Ich würde dir zustimmen, aber um das HTML in der Frage habe ich mich nicht gekümmert. ;-)

        Grüße
        Thomas