HTML in XSL, Verschachtelte Templates
Polarbear
- xsl
0 dey0 Thomas J.S.
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
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
Hallo,
<xsl:template match="docs/row[position() > 1]">
<xsl:template name="row2-x">
</xsl:template>
Das kann nicht funktionieren.
Grüße
Thomas
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.
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
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