XSL if
Hamdi Gezer
- xsl
0 MudGuard0 Hamdi Gezer0 MudGuard0 Hamdi Gezer0 MudGuard
0 Thomas J.S.
Hallo,
ich möchte aus eine XML-Datei, alle Tags ab dem 6. Element ausgeben, dieses klappt gut. Weiteres möchte ich, dass im Falle, wenn weniger als 6. Elemente vorhanden sind, dass eine Meldung ausgegeben wird. Dieses klappt leider nicht.
Weißt Jemand, wie ich es hinbekommen kann.
Unten ist der XSL-Teil gekürzt angegeben.
Vielen Dank für die Unterstützung.
Gruß
Hamdi
xsl:template
...
<xsl:apply-templates select="document('Test.xml')//Element"/>
...
</xsl:template>
<xsl:template match="Element">
<xsl:if test="position() > 5">
<xsl:apply-templates />
</xsl:if>
<xsl:if test="position() <= 5">
<p>Keine Elemente!</p>
</xsl:if>
</xsl:template>
Hi,
<xsl:apply-templates select="document('Test.xml')//Element"/>
Also wird das Template für alle "Element"-Elemente jeweils aufgerufen.
<xsl:template match="Element">
<xsl:if test="position() > 5">
<xsl:apply-templates />
</xsl:if>
Für das 6. bis letzte "Element"-Element wird apply-templates für die Kind-Elemente ausgeführt.
<xsl:if test="position() <= 5">
<p>Keine Elemente!</p>
</xsl:if>
Für die ersten 5 wird also "<p>Keine Elemente!</p>" ausgegeben.
Du erhältst also bis zu 5 mal "<p>Keine Elemente!</p> gefolgt von was auch immer das apply-templates für das 6. bis letzte "Element"-Element ergibt.
Du willst aber:
Wenn die Anzahl (count()) 5 oder weniger ist, "<p>Keine Elemente!</p>" ausgeben (5 sind keine?), sonst das apply-templates.
Ich würde hier statt zwei if ein choose machen:
xsl:choose
<xsl:when test="count(document('Test.xml')//Element) <= 5">
<p>Keine Elemente!</p>
</xsl:when>
xsl:otherwise
<xsl:apply-templates select="document('Test.xml')//Element"/>
</xsl:otherwise>
</xsl:choose>
cu,
Andreas
Hi,
zuerst bedanke ich mich für dein Antwort.
Es hat leider nicht geklappt, ich bekomme mehrmals untereinander die Ausgabe "Keine Elemente", auch wenn ich mehr als 5 Elemente habe ändert sich nicht daran, "otherwise" wird nicht ausgeführt.
Grüße
Hamdi
Hi,
Es hat leider nicht geklappt, ich bekomme mehrmals untereinander die Ausgabe "Keine Elemente", auch wenn ich mehr als 5 Elemente habe ändert sich nicht daran, "otherwise" wird nicht ausgeführt.
Dann machst Du was falsch.
Da Du Deinen Versuch aber nicht zeigst, kann ich nicht sagen, was.
cu,
Andreas
Hi,
ich habe es so:
<?xml version="1.0" encoding="iso-8859-1"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:template match="/">
<html>
...
<xsl:apply-templates select="document('Test.xml')//Element"/>
...
</html>
</xsl:template>
<xsl:template match="Element">
xsl:choose
<xsl:when test="count(document('Test.xml')//Element) <= 5">
<p>Keine Elemente!</p>
</xsl:when>
xsl:otherwise
<xsl:apply-templates select="document('Test.xml')//Element"/>
</xsl:otherwise>
</xsl:choose>
</xsl:template>
...
</xsl:stylesheet>
ausprobiert, leide hat es nicht funktioniert. Dann habe ich es so:
<?xml version="1.0" encoding="iso-8859-1"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:template match="/">
<html>
...
<xsl:apply-templates select="document('Test.xml')//Element"/>
...
</html>
<xsl:template match="Element">
<xsl:param name="count"/>
xsl:choose
<xsl:when test="position() >= 5">
<xsl:apply-templates />
</xsl:when>
<xsl:when test="$count <= 5">
<p>Keine Elemente!</p>
</xsl:when>
</xsl:choose>
</xsl:template>
...
</xsl:stylesheet>
ausprobiert, leider hat es auch nicht geklappt. Dann habe ich so:
<?xml version="1.0" encoding="iso-8859-1"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:template match="/">
<html>
...
<xsl:apply-templates select="document('Test.xml')//Element"/>
...
</html>
<xsl:template match="Element">
<xsl:param name="count"/>
<xsl:if test="$count = 5">
<p>Im Archive befinden sich keine Nacrichten!</p>
</xsl:if>
<xsl:if test="position() > 5">
<xsl:apply-templates />
</xsl:if>
</xsl:template>
...
</xsl:stylesheet>
ausprobiert, hier hat es auch leider nicht geklappt.
Ich möchte aus der XML-Datei alle Knoten ab dem 6. Knote ausgeben. Wenn weniger als 6 Knoten vorhanden sind sollte einmal "Keine Elemente" ausgegeben werden.
Gruß
Hamdi
Hi,
ich habe es so:
<html>
...
<xsl:apply-templates select="document('Test.xml')//Element"/>
Anstelle dieses apply-templates
</html>
hättest Du dieses choose
xsl:choose
<xsl:when test="count(document('Test.xml')//Element) <= 5">
<p>Keine Elemente!</p>
</xsl:when>
xsl:otherwise
<xsl:apply-templates select="document('Test.xml')//Element"/>
</xsl:otherwise>
</xsl:choose>
nehmen sollen.
Du willst die Fallunterscheidung ja nicht für jedes "Element"-Element haben, sondern nur ein einziges Mal.
cu,
Andreas
Vielen Dank für deine Unterstützung
Jetzt klappt ;-)
Grüße
Hamdi
Hallo,
ich möchte aus eine XML-Datei, alle Tags ab dem 6. Element ausgeben, dieses klappt gut. Weiteres möchte ich, dass im Falle, wenn weniger als 6. Elemente vorhanden sind, dass eine Meldung ausgegeben wird. Dieses klappt leider nicht.
xsl:template
...
<xsl:apply-templates select="document('Test.xml')//Element"/>
...
</xsl:template>
<xsl:template match="Element">
<xsl:if test="position() > 5">
Das kann nichts bringen. position() wird hier immer 1 sein, weil das Template für jedes Element neu instantiiert (sprich neu aufgerufen und ausgeführt) wird.
Statt:
xsl:template
...
<xsl:apply-templates select="document('Test.xml')//Element"/>
...
</xsl:template>
nimm sowas (hier nur schematisch dargestellt):
xsl:template
...
<xsl:variable name="counter" select="count(document('Test.xml')//Element)" />
<xsl:for-each select="document('Test.xml')//Element">
xsl:choose
when test: counter = 0
keine Elemente
when test: position() < 6
apply-templates
otherwise
...
</xsl:template>
Grüße
Thomas