Google Groups no longer supports new Usenet posts or subscriptions. Historical content remains viewable.
Dismiss

xslt: Tabelle mit Zeilen abwechselnder Formatierung

13 views
Skip to first unread message

Friedel Jantzen

unread,
Oct 12, 2009, 12:19:27 PM10/12/09
to
Hallo,

die Elemente aus einem xml-Dokument werden �ber xslt in eine html-Tabelle
geschrieben.
Die rows sollen abwechselnd formatiert werden (css).

Afaik gibt es in xslt keine echten Variablen. Eine echte Variable k�nnte
ich als Umschalter einsetzen, um die class f�r den style zu steuern.

Eine L�sung w�re, dem Element im xml-Dokument ein Attribut mitzugeben und
es im xsl-Skript f�r die Formatierung auszuwerten.
Es w�re aber besser, wenn ich das xml-Dokument von
Formatierungsinformationen freihalten k�nnte.

Habt Ihr eine Idee dazu, wie das mit xslt machbar ist?

Vielen Dank,
Friedel

Bernd Eckenfels

unread,
Oct 12, 2009, 12:21:02 PM10/12/09
to
Friedel Jantzen <nospa...@freenet.de> wrote:
> Afaik gibt es in xslt keine echten Variablen. Eine echte Variable kᅵnnte
> ich als Umschalter einsetzen, um die class fᅵr den style zu steuern.

Es gibt Parameter, aber in deinem Fall nimmt man ᅵblicherweise ein if mit
dem 2er modulus des Zaehlers.

Gruss
Bernd

Martin Honnen

unread,
Oct 12, 2009, 12:32:23 PM10/12/09
to
Friedel Jantzen wrote:

> die Elemente aus einem xml-Dokument werden �ber xslt in eine html-Tabelle


> geschrieben.
> Die rows sollen abwechselnd formatiert werden (css).
>

> Afaik gibt es in xslt keine echten Variablen. Eine echte Variable k�nnte
> ich als Umschalter einsetzen, um die class f�r den style zu steuern.
>
> Eine L�sung w�re, dem Element im xml-Dokument ein Attribut mitzugeben und
> es im xsl-Skript f�r die Formatierung auszuwerten.
> Es w�re aber besser, wenn ich das xml-Dokument von
> Formatierungsinformationen freihalten k�nnte.


>
> Habt Ihr eine Idee dazu, wie das mit xslt machbar ist?

<xsl:apply-templates select="foo"/>

und dann mit position() arbeiten:

<xsl:template match="foo">
<tr class="if (position() mod 2 eq 1) then 'odd' else 'even'">
...
</tr>
</xsl:template>

if/then/else ist XPath 2.0, kann also nur mit Saxon 9 oder AltovaXML
Tools benutzt werden.

Mit XSLT/XPath 1.0 ist es etwas umst�ndlicher:
<xsl:template match="foo">
<xsl:variable name="class">
<xsl:choose>
<xsl:when test="position() mod 2 = 1">odd</xsl:when>
<xsl:otherwise>even</xsl:otherwise>
</xsl:choose>
</xsl:variable>
<tr class="{$class}">
...
</tr>
</xsl:template>

position() funktioniert nat�rlich auch mit <xsl:for-each
select="foo">...</xsl:for-each>.

--

Martin Honnen
http://msmvps.com/blogs/martin_honnen/

Simon Krahnke

unread,
Oct 12, 2009, 12:51:31 PM10/12/09
to
* Bernd Eckenfels <bern...@eckenfels.net> (18:21) schrieb:

> Friedel Jantzen <nospa...@freenet.de> wrote:
>> Afaik gibt es in xslt keine echten Variablen. Eine echte Variable k�nnte
>> ich als Umschalter einsetzen, um die class f�r den style zu steuern.
>
> Es gibt Parameter, aber in deinem Fall nimmt man �blicherweise ein if mit


> dem 2er modulus des Zaehlers.

Kann man das jetzt nicht auch mit CSS3 erreichen? Es ist eigentlich eine
rein visuelle Auszeichnung, die mit dem Dokumentinhalt nicht zu tun
hat.

mfg, simon .... l

Friedel Jantzen

unread,
Oct 13, 2009, 2:04:37 AM10/13/09
to
Danke f�r Eure Antworten!
Ich benutze MSXML3 (mit C++), das afaik nur XPATH1.0 und XSLT1.0
unterst�tzt, werde aber Martins beide Beispiele ausprobieren.
Friedel

Friedel Jantzen

unread,
Oct 13, 2009, 6:44:27 AM10/13/09
to
Wie erwartet geht es nicht mit if...then (aber mit der lokalen Variablen).
MSXML3 IXSLProcessor::transform() gibt dabei keinen Fehler aus, der ganze
Ausdruck "if (position() mod 2 eq 1) then 'odd' else 'even'" wird einfach
als class-Attribut gesetzt =:o
Nochmal Danke!
Friedel

Martin Honnen

unread,
Oct 13, 2009, 7:02:03 AM10/13/09
to

Da ist mir ein Fehler unterlaufen, es m�sste ein "attribute value
template" sein:
<tr class="{if (position() mod 2 eq 1) then 'odd' else 'even'}">

Aber der if/then/else-Ausdruck ist XPath 2.0 und MSXML unterst�tzt nur
XSLT und XPath 1.0.

Friedel Jantzen

unread,
Oct 14, 2009, 2:52:34 AM10/14/09
to
Hallo Martin,
danke f�r den Tipp!

> Da ist mir ein Fehler unterlaufen, es m�sste ein "attribute value
> template" sein:
> <tr class="{if (position() mod 2 eq 1) then 'odd' else 'even'}">
>
> Aber der if/then/else-Ausdruck ist XPath 2.0 und MSXML unterst�tzt nur
> XSLT und XPath 1.0.

Ja, ich hatte eine Fehlermeldung erwartet.
Friedel

0 new messages