jensp: xsl:if in Schleife, Ausgabe außerhalb

Beitrag lesen

Hallo Janine,

ja, XSL führt häufig zu Knoten im Kopf wenn man nicht ständig damit arbeitet…

Folgende Lösung ist mir eingefallen:

<?xml version="1.0" encoding="UTF-8"?>

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" exclude-result-prefixes="xs" version="2.0">

    <xsl:output method="xml" encoding="UTF-8" indent="yes"/>

    <xsl:template match="/">

        <xsl:choose>
            <xsl:when test="/check/bpd/test[text() = 'false']">
                <ul>
                    <xsl:for-each select="/check/bpd/test">
                        <xsl:if test="text() = 'false'">
                            <li>
                                <xsl:text>Test </xsl:text>

                                <xsl:value-of select="../@name"/>
                                <xsl:text>: Fehler bei </xsl:text>

                                <xsl:value-of select="@name"/>
                            </li>
                        </xsl:if>
                    </xsl:for-each>
                </ul>
            </xsl:when>
            <xsl:otherwise>
                <p>Es sind keine fehlerhaften Verlinkungen vorhanden. :)</p>
            </xsl:otherwise>
        </xsl:choose>
    </xsl:template>
</xsl:stylesheet>

Zu Erklärung: Mit <xsl:choose> wird zwischen zwei Alternativen unterschieden. Der Test beim <xsl:when> prüft ob es ein Element <test> mit dem Text false gibt. Wenn das der Fall ist, wird die Liste mit den Fehlern erzeugt. Andernfalls wird <xsl:otherwise> verwendet, und nur die Meldung ausgegeben, dass es keine Fehler gibt.

Ich denke du sieht jetzt auch den Fehler in der Bedingung deines <xsl:if>: Die eckigen Klammern fehlen. Mit den eckigen Klammern kannst du bei XPath ganz allgemein Bedingungen für Element angegeben. Das funktioniert auch in Selektoren. Man könnte ggf. sogar auf if/choose verzichten und das ganze mit zwei Templates regeln:

<?xml version="1.0" encoding="UTF-8"?>

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" exclude-result-prefixes="xs" version="2.0">

    <xsl:output method="xml" encoding="UTF-8" indent="yes"/>

    <xsl:template match="/check[not(./bpd/test/text() = 'false')]">
        <p>Es sind keine fehlerhaften Verlinkungen vorhanden. :)</p>
    </xsl:template>

    <xsl:template match="/check[./bpd/test/text() = 'false']">
        <ul>
            <xsl:for-each select="./bpd/test">
                <xsl:if test="text() = 'false'">
                    <li>
                        <xsl:text>Test </xsl:text>

                        <xsl:value-of select="../@name"/>
                        <xsl:text>: Fehler bei </xsl:text>

                        <xsl:value-of select="@name"/>
                    </li>
                </xsl:if>
            </xsl:for-each>
        </ul>
    </xsl:template>

</xsl:stylesheet>

Die Lösung ist entspricht etwas besser der deklarativen Natur von XSL, ist aber eventuell später schwerer nachvollziehbar.

Beste Grüße

Jens