tag:forum.selfhtml.org,2005:/self CSS-Klasse aus mehreren Werten zusammensetzen – SELFHTML-Forum 2008-07-01T15:11:44Z https://forum.selfhtml.org/self/2008/jul/1/css-klasse-aus-mehreren-werten-zusammensetzen/1263371#m1263371 Mr. Horse 2008-07-01T14:28:46Z 2008-07-01T14:28:46Z CSS-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#m1263372 Christian Seiler self@christian-seiler.de http://www.christian-seiler.de/projekte/xslt-json/ 2008-07-01T14:35:36Z 2008-07-01T14:35:36Z CSS-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#m1263373 Mr. Horse 2008-07-01T15:11:44Z 2008-07-01T15:11:44Z Problem 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>