Julian von Mendel: xsl:param : redefining variable

Hi,

ich habe folgende Eingangsdaten:

<step>123</step>
<step>foo</step>
<step>bar</step>
<step clear="clear">hehe</step>
<step>bla</step>

Die einzelnen steps gehe ich per <xsl:for-each select=".//slide">... durch. Innerhalb der Schleife möchte ich einem anderen Template die Position (position()) des step's übergeben, der als letztes ein "clear"-Attribut auf "clear" gesetzt hatte, wenn das noch nie der Fall war eine 0. Wie mache ich das am besten? Ich habe versucht im for-each einfach zu prüfen, ob der aktuelle step das Attribut gesetzt hat und wenn ja, mir in einer Variable seine Position zu merken, die ich dann später dem Template übergeben kann. Dafür müsste ich aber eine Variable überschreiben, was FOP mit der Fehlermeldung
xsl:variable : redefining displaysince
quittiert.

Schöne Grüße
Julian

--
ie:% fl:| br:^ va:| ls:< fo:| rl:( n4:° ss:) de:> js:| ch:{ sh:( mo:? zu:)
  1. Hallo,

    ich habe folgende Eingangsdaten:

    <step>123</step>
    <step>foo</step>
    <step>bar</step>
    <step clear="clear">hehe</step>
    <step>bla</step>

    Die einzelnen steps gehe ich per <xsl:for-each select=".//slide">... durch. Innerhalb der Schleife möchte ich einem anderen Template die Position (position()) des step's übergeben, der als letztes ein "clear"-Attribut auf "clear" gesetzt hatte, wenn das noch nie der Fall war eine 0. Wie mache ich das am besten?

    Die Abfrage würde ich im "anderen Template" machen.
    <xsl:variable name="lastSlideID">
     <xsl:for-each select=".//slide[@clear]">
      <xsl:if test="position() = last()">
       <xsl:value-of select="generate-id(.)" />
      </xsl:if>
     </xsl:for-each>
    </xsl:variable>

    <xsl:template match="/">
     <xsl:for-each select=".//slide">
      <xsl:variable name="p">
       <xsl:if test="generate-id(.) = $lastSlideID">
        <xsl:value-of select="position()" />
       </xsl:if>
      </xsl:variable>
                    ...
      <xsl:call-template name="foo">
       <xsl:with-param name="pos" select="$p" />
      </xsl:call-template>
     </xsl:for-each>
    </xsl:template>
    <xsl:template name="foo">
     <xsl:param name="pos" />
     <xsl:variable name="p">
      xsl:choose
       <xsl:when test="not($pos = '')">
        <xsl:value-of select="$pos" />
       </xsl:when>
       xsl:otherwise0</xsl:otherwise>
      </xsl:choose>
     </xsl:variable>
             ....
            <!-- $p kannst du dann verwenden um den Wert zu nützen-->
    </xsl:template>

    Grüße
    Thomas

    1. Hi,

      vielen Dank, jetzt gehts :)
      Ist es grundsätzlich unmöglich, eine Variable innerhalb eines Templates zu überschreiben, oder gibt es da auch eine Möglichkeit?

      Schöne Grüße
      Julian

      --
      ie:% fl:| br:^ va:| ls:< fo:| rl:( n4:° ss:) de:> js:| ch:{ sh:( mo:? zu:)
      1. Hallo,

        vielen Dank, jetzt gehts :)
        Ist es grundsätzlich unmöglich, eine Variable innerhalb eines Templates zu überschreiben,

        Es ist grundsätzlich nicht möglich Variablen in XSLT 1.0 zu überschreiben (egal wo).

        oder gibt es da auch eine Möglichkeit?

        Jein, weil Trick 17 im Grunde die Variable auch nicht überschreibt:

        <xsl:template match="X">
         <xsl:call-template name="ab">
          <xsl:with-param name="a" select="0" />
         </xsl:call-template>
        </xsl:template>

        <xsl:template name="ab">
         <xsl:param name="a" />
         <xsl:variable name="b" select="$a + 1" />

        <xsl:value-of select="$b" /> /
         <xsl:if test="$b &lt; 10">
          <xsl:call-template name="ab">
           <xsl:with-param name="a" select="$b" />
          </xsl:call-template>
         </xsl:if>
        </xsl:template>

        Ausgabe ist: 1 / 2 / 3 / 4 / 5 / 6 / 7 / 8 / 9 / 10 /
        Es scheint, also dass die Variable überschreiben wurde, aber das ist nicht der fall, denn der Wert ist bei jedem durchgang "$a + 1", dass sich $a ändert ist eine andere Sache.

        Grüße
        Thomas