tag:forum.selfhtml.org,2005:/selfCSS-Klasse aus mehreren Werten zusammensetzen – SELFHTML-Forum2008-07-01T15:11:44Zhttps://forum.selfhtml.org/self/2008/jul/1/css-klasse-aus-mehreren-werten-zusammensetzen/1263371#m1263371Mr. Horse2008-07-01T14:28:46Z2008-07-01T14:28:46ZCSS-Klasse aus mehreren Werten zusammensetzen<p>Hallo,</p>
<p>ich baue mir per XSLT ein Menü zusammen. Der aktive Menüpunkt soll dabei die Klasse "current" bekommen. Zusätzlich muss das erste LI-Elemente in der Navigation die Klasse "first" bekommen.<br>
Ich versuche es im Moment so:</p>
<p><xsl:template match="menuItem" mode="subnav"><br>
<li><br>
<xsl:attribute name="class" value="" /><br>
<xsl:if test="@href = $current_file_path"><br>
<xsl:attribute name="class"><xsl:value-of select="concat(@class,' current')" /></xsl:attribute><br>
</xsl:if><br>
<xsl:if test="position()=1"><br>
<xsl:attribute name="class"><xsl:value-of select="concat(@class,' first')" /></xsl:attribute><br>
</xsl:if><br>
<!-- ... etc. --></p>
<p>Dabei wird der Wert des class-Attributs aber leider innerhalb des zweiten if-Blocks überschrieben. Das Ergebnis ist dann im resultierenden HTML "first" statt "current first".<br>
Trifft das zweite if-Statement nicht zu, so erhalte ich class="current".</p>
<p>Das heißt, die Einzelteile des XSLT-Fragments oben scheinen korrekt zu sein - aber es hapert an der Gesamtlogik.<br>
Vielleicht könnt Ihr mir weiterhelfen?</p>
<p>Danke!</p>
<p>So long,<br>
Andreas</p>
<div class="signature">-- <br>
No, Sir, I don't like it.
</div>
https://forum.selfhtml.org/self/2008/jul/1/css-klasse-aus-mehreren-werten-zusammensetzen/1263372#m1263372Christian Seilerself@christian-seiler.dehttp://www.christian-seiler.de/projekte/xslt-json/2008-07-01T14:35:36Z2008-07-01T14:35:36ZCSS-Klasse aus mehreren Werten zusammensetzen<p>Hallo!</p>
<blockquote>
<p><xsl:template match="menuItem" mode="subnav"><br>
<li><br>
<xsl:attribute name="class" value="" /><br>
<xsl:if test="@href = $current_file_path"><br>
<xsl:attribute name="class"><xsl:value-of select="concat(@class,' current')" /></xsl:attribute><br>
</xsl:if><br>
<xsl:if test="position()=1"><br>
<xsl:attribute name="class"><xsl:value-of select="concat(@class,' first')" /></xsl:attribute><br>
</xsl:if><br>
<!-- ... etc. --></p>
</blockquote>
<p>Du solltest eher so etwas machen:</p>
<pre><code class="block language-xml"><span class="token tag"><span class="token tag"><span class="token punctuation"><</span><span class="token namespace">xsl:</span>template</span> <span class="token attr-name">match</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>menuItem<span class="token punctuation">"</span></span> <span class="token attr-name">mode</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>subnav<span class="token punctuation">"</span></span><span class="token punctuation">></span></span>
<span class="token tag"><span class="token tag"><span class="token punctuation"><</span>li</span><span class="token punctuation">></span></span>
<span class="token tag"><span class="token tag"><span class="token punctuation"><</span><span class="token namespace">xsl:</span>attribute</span> <span class="token attr-name">name</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>class<span class="token punctuation">"</span></span><span class="token punctuation">></span></span>
<span class="token tag"><span class="token tag"><span class="token punctuation"><</span><span class="token namespace">xsl:</span>if</span> <span class="token attr-name">test</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>@href = $current_file_path<span class="token punctuation">"</span></span><span class="token punctuation">></span></span>
<span class="token tag"><span class="token tag"><span class="token punctuation"><</span><span class="token namespace">xsl:</span>value-of</span> <span class="token attr-name">select</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span><span class="token punctuation">'</span> current'<span class="token punctuation">"</span></span> <span class="token punctuation">/></span></span>
<span class="token tag"><span class="token tag"><span class="token punctuation"></</span><span class="token namespace">xsl:</span>if</span><span class="token punctuation">></span></span>
<span class="token tag"><span class="token tag"><span class="token punctuation"><</span><span class="token namespace">xsl:</span>if</span> <span class="token attr-name">test</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>position() = 1<span class="token punctuation">"</span></span><span class="token punctuation">></span></span>
<span class="token tag"><span class="token tag"><span class="token punctuation"><</span><span class="token namespace">xsl:</span>value-of</span> <span class="token attr-name">select</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span><span class="token punctuation">'</span> first'<span class="token punctuation">"</span></span> <span class="token punctuation">/></span></span>
<span class="token tag"><span class="token tag"><span class="token punctuation"></</span><span class="token namespace">xsl:</span>if</span><span class="token punctuation">></span></span>
<span class="token tag"><span class="token tag"><span class="token punctuation"></</span><span class="token namespace">xsl:</span>attribute</span><span class="token punctuation">></span></span>
<span class="token comment"><!-- etc. --></span>
<span class="token tag"><span class="token tag"><span class="token punctuation"></</span><span class="token namespace">xsl:</span>template</span><span class="token punctuation">></span></span>
</code></pre>
<p>Du hast bei Deinem Versuch zwei Dinge nicht beachtet:</p>
<ol>
<li>
<p>XSL ist eine funktionale Programmiersprache, d.h. Du kannst nicht einfach etwas Setzen und hinterher ändern. Selbst wenn Du zweimal hintereinander <a href="xsl:variable" rel="nofollow noopener noreferrer">xsl:variable</a> mit dem gleichen Namen hast, deklarierst Du im Endeffekt ZWEI Variablen, wobei die erste nur bis zum Auftauchen der zweiten sichtbar ist.</p>
</li>
<li>
<p>XPath-Selektoren beziehen sich immer auf den Quell-Dokumentbaum, d.h. @class matcht garantiert *nicht* das class-Attribut des *generierten* Knotens - sondern höchstens ein potentiell existierendes class-Attribut des aktuellen Knotens im Quelldokument.</p>
</li>
</ol>
<p>Viele Grüße,<br>
Christian</p>
<div class="signature">-- <br>
<a href="http://del.icio.us/chris_se/servertipps" rel="nofollow noopener noreferrer">Mein "Weblog"</a> [<a href="http://del.icio.us/rss/chris_se/servertipps" rel="nofollow noopener noreferrer">RSS</a>]<br>
<a href="http://www.christian-seiler.de/projekte/xslt-json/" rel="nofollow noopener noreferrer">Using XSLT to create JSON output</a> (Saxon-B 9.0 for Java)
</div>
https://forum.selfhtml.org/self/2008/jul/1/css-klasse-aus-mehreren-werten-zusammensetzen/1263373#m1263373Mr. Horse2008-07-01T15:11:44Z2008-07-01T15:11:44ZProblem gelöst<p>Hallo Christian,</p>
<p>danke für Deine superschnelle Antwort!</p>
<blockquote>
<p>Du solltest eher so etwas machen:<br>
[...]</p>
</blockquote>
<p>Das klappt tatsächlich. Und erscheint mir jetzt, wo ich's weiß, auch sauberer und XML-gemäßer.</p>
<blockquote>
<ol>
<li>XSL ist eine funktionale Programmiersprache, d.h. Du kannst nicht einfach etwas Setzen und hinterher ändern.</li>
</ol>
</blockquote>
<p>Ja, habe ich mir hinter die Ohren geschrieben (ich hatte auch anderswo im Netz schon den Hinweis gefunden, dass man z.B. den Wert einer Variablen in XSL nicht ändern kann.</p>
<blockquote>
<ol start="2">
<li>XPath-Selektoren beziehen sich immer auf den Quell-Dokumentbaum, d.h. @class matcht garantiert *nicht* das class-Attribut des *generierten* Knotens - sondern höchstens ein potentiell existierendes class-Attribut des aktuellen Knotens im Quelldokument.</li>
</ol>
</blockquote>
<p>Ah, ok, habe da zu sehr von den Script-Sprachen her gedacht.<br>
Danke für Deine Hilfe.</p>
<p>So long,<br>
Andreas</p>
<div class="signature">-- <br>
No, Sir, I don't like it.
</div>