Laden...

HTML in XSLT, Verschachtelte Templates

Erstellt von polarbear vor 18 Jahren Letzter Beitrag vor 18 Jahren 1.244 Views
P
polarbear Themenstarter:in
19 Beiträge seit 2005
vor 18 Jahren
HTML in XSLT, 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

<?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 zur Realisierung der obigen Darstellung!

Dank und Gruss
Polarbear

476 Beiträge seit 2004
vor 18 Jahren
Ein anderer Vorschlag

Hallo polarbear,

ich hätte folgenden Vorschlag:


<?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="row">
      <table border="1">
         <xsl:choose>
            <xsl:when test="position()=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 /></td>
		</tr>
             </xsl:when>
             <xsl:otherwise>
                <tr><td colspan="2"><xsl:value-of select="@title" /></td></tr>
             </xsl:otherwise>
          </xsl:choose>
       </table>
    </xsl:template>
</xsl:stylesheet>

Kommt das einer Lösung für dein Problem nahe?

-yellow

Selbst ein Weg von tausend Meilen beginnt mit einem Schritt (chinesisches Sprichwort).

Mein Blog: Yellow's Blog auf sqlgut.de