Hamdi Gezer: XSL if

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() &gt; 5">
  <xsl:apply-templates />
 </xsl:if>
 <xsl:if test="position() &lt;= 5">
  <p>Keine Elemente!</p>
 </xsl:if>
</xsl:template>

  1. 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() &gt; 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() &lt;= 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) &lt;= 5">
        <p>Keine Elemente!</p>
      </xsl:when>
      xsl:otherwise
        <xsl:apply-templates select="document('Test.xml')//Element"/>
      </xsl:otherwise>
    </xsl:choose>

    cu,
    Andreas

    --
    Warum nennt sich Andreas hier MudGuard?
    O o ostern ...
    Fachfragen unaufgefordert per E-Mail halte ich für unverschämt und werde entsprechende E-Mails nicht beantworten. Für Fachfragen ist das Forum da.
    1. 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

      1. 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

        --
        Warum nennt sich Andreas hier MudGuard?
        O o ostern ...
        Fachfragen unaufgefordert per E-Mail halte ich für unverschämt und werde entsprechende E-Mails nicht beantworten. Für Fachfragen ist das Forum da.
        1. 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) &lt;= 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() &gt;= 5">
              <xsl:apply-templates />
             </xsl:when>
             <xsl:when test="$count &lt;= 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() &gt; 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

          1. 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) &lt;= 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

            --
            Warum nennt sich Andreas hier MudGuard?
            O o ostern ...
            Fachfragen unaufgefordert per E-Mail halte ich für unverschämt und werde entsprechende E-Mails nicht beantworten. Für Fachfragen ist das Forum da.
            1. Vielen Dank für deine Unterstützung

              Jetzt klappt ;-)

              Grüße
              Hamdi

  2. 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() &gt; 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() &lt; 6
          apply-templates
        otherwise
     ...
    </xsl:template>

    Grüße
    Thomas