bubba: dynamischer Parameter in call-template

hallo forum-user,

ich habe ein problem folgender art und habe leider im netz kein beispiel dazu gefunden:

nehmen wir eine tabelle an; eine Reihe sind verschiedene Firmen (Angabe: Name, Inhaber, Branche, Gründungsjahr etc.) Nun kann es passieren, dass es mehrere Inhaber gibt - die Tabellenreihe wird größer, da eine Zelle hinzukommt. damit die zellen dynamisch angesprochen werden können, definiere ich einen parameter col. problematisch ist jedoch, dass mehere Inhaber zu einer inhabergruppe zusammengefasst werden sollen.

das template matcht auf die tabelle:
<for-each select="reihe">
 darin dann eine choose-abfrage, ob ein oder mehrere inhaber drin stehen:
 xsl:choose
  <xsl:when test="Zellenanzahl=x">
   <xsl:call-template name="inhaber"/>
  </xsl:when>
  xsl:otherwise<!-- dann müssen es mehrere autoren sein -->
   <autorengruppe>
    <xsl:call-template name="inhaber"/>
  </xsl:otherwise>
 </xsl:choose>

nachfolgend werden die angaben wie branche, gründungsjahr etc. verarbeitet, wobei der pfad dynamisch angesprochen wird:...<xsl:value-of select="tabelle/zelle[$col+1]/..."/> - da sich ja der abstand zum inhaber proportional ändert, kann man das ja so schreiben.
</xsl:template>

im template name="inhaber" werden die inhaber verarbeitet durch eine choose-anweisung:

xsl:choose
 <xsl:when test="wenn du selbst autor bist">
  <inhaber>
   ...
  </inhaber>
   <xsl:call-template name="inhaber">
    <xsl:with-param name="col" select="$col+1"/>
   </xsl:call-template>
 </xsl:when>
 xsl:otherwise/
</xsl:template>

nun habe ich aber das problem, dass ich nicht weiß, wie ich dein parameter col, der sich ja in der call-template anweisung verändert hat, im eigentlich template wieder verwenden kann!? (deswegen hab ich auf <xsl:param bewusst erstmal verzichtet).
-- ich habe es so formuliert, da meine pfade sehr komplex sind und so sicher keiner auf anhieb verstanden hätte, was ich will. bei mir habe ich es ja soweit fertig, es geht nur um die übergabe des veränderten parameters --

  1. Hallo,

    -- ich habe es so formuliert, da meine pfade sehr komplex sind und so sicher keiner auf anhieb verstanden hätte, was ich will.

    Nun leider hast du es umgekehrt geschafft, zumindest verstehe ich - anhand deines Beispielt - nicht wo bei dei das Problem ist bzw. was du erreichen willst. Vor allem aber fehlen die eigentlichen Templates und ein stück von XML und eine Beschreibung was als Ergebnis erwartet wird.

    Was ich jetzt verstehe: du möchtest am Ende eine Tabelle haben:

    Name   Inhaber   Branche   Gründungsjahr
        A       B          C          1234
        A       B          C          1234

    Es kann sein dass in XML mehrere Inhaber angegeben sind:

    <inhaber>
      <name>...
      <name>...
      <name>...
    </inhaber>
    ...
    <inhaber>
      <name> ...
    </inhaber>

    Dann sollte sich die Tabelle erweitern:

    Name   Inhaber   Inhaber   Inhaber   Branche   Gründungsjahr
        A       B1         B2       B3        C          1234
        A       B1                            C          1234

    Die Frage ist jetzt für mich: ist das richtg so?

    Grüße
    Thomas

    1. hallo thomas,

      nochmal zur erklärung:

      der ausgangspunkt ist eine tabelle in folgender form:

      firma inhaber branche gründungsjahr ...
        A     i1      B         C

      nachfolgend kann die tabelle auch in ihrer zellenanzahl wachsen (bei mehreren inhabern), z.b.:

      firma inhaber inhaber branche gründungsjahr ...
        A      i1      i2     B           C
      (natürlich auch mehrere firmen, abgefangen von einer for-each schleife):

      im template match (siehe ersten eintrag) wird alles soweit verarbeitet, außer die inhaber - dieser werden im call-template verarbeitet, da ein inhaber inhaber bleibt, mehrere inhaber aber zur inhabergruppe werden -> in diesem fall reicht ja der test, ob z.b. wie oben die zellenanzahl=4, dann inhaber, wenn größer dann inhabergruppe (sorry, hatte mich da im ersten eintrag verschrieben (autorengruppe)!?.

      im call-template wird dann der inhaber bzw. mehrere inhaber verarbeitet, wobei der test ist, ob der aktuelle knoten/zelle selbst inhaber ist. der parameter col wird erhöht, solange bis der aktuelle knoten kein inhaber mehr ist (im zweiten beispiel ist der parameter dann 4 [startwert col=2], wobei col die zellenposition ist. nun möchte ich den parameter, der sich im zweiten beipspiel erhöht hat, wieder an das template match="tabelle" übergeben, um branche und gründungsjahr zu verarbeiten. da diese immer den selben abstand zum inhaber haben kann man es ja die position mit [$col+1] für branche und [$col+2] für gründungsjahr angeben.

      die frage lautet also: wenn es mehrere inhaber sind, werden diese im call-template verarbeitet, wobei sich der parameter col verändert. dieser soll dann an das template verändert zurückgegeben werden, damit der inhalt für branche und gründungsjahr verarbeitet werden. wie kann man diesen veränderten parameter zurückgeben?

      1. Hallo,

        Ich glaube wir drehen uns im Kreis.
        Ich verstehe leider noch immer nicht was du machen möchtest. *)
        Wenn es dir nur darum geht, wie du ein Parameter an einem Temnplate übergibts:
        --------- sehr schematisch ----------

        <xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">  
         <xsl:template name="Template1">  
          <xsl:param name="Param1"/>  
          <xsl:param name="Param2"/>  
          <xsl:choose>  
           <xsl:when test="$Param1 &lt; $Param2">  
            <tuewas>hier</tuewas>  
            <xsl:call-template name="Template1">  
             <xsl:with-param name="Param1" select="$Param1 + 1"/>  
             <xsl:with-param name="Param2" select="$Param2"/>  
            </xsl:call-template>  
           </xsl:when>  
           <xsl:otherwise>  
            <tuewas>hier</tuewas>  
           </xsl:otherwise>  
          </xsl:choose>  
         </xsl:template>  
          
         <xsl:template match="Element2">  
          <xsl:param name="Param1"/>  
          <xsl:param name="Var1" select="count(Zeilen)"/>  
          <xsl:choose>  
           <xsl:when test="$Param1 &lt; $Var1">  
            <xsl:variable name="Var2" select="$Param1 + 1"/>  
            <tuewas>hier</tuewas>  
            <xsl:call-template name="Template1">  
             <xsl:with-param name="Param1" select="$Var2"/>  
            </xsl:call-template>  
           </xsl:when>  
           <xsl:otherwise>  
            <tuewas>hier</tuewas>  
           </xsl:otherwise>  
          </xsl:choose>  
         </xsl:template>  
          
         <xsl:template match="/">  
          <xsl:call-template name="Template1">  
           <xsl:with-param name="Param1" select="0" />  
           <xsl:with-param name="Param2" select="count(Zeilen)" />  
          </xsl:call-template>  
          
          <xsl:apply-templates select="Element1">  
           <xsl:with-param name="Param1" select="0"/>  
          </xsl:apply-templates>  
         </xsl:template>  
        </xsl:stylesheet>
        

        -----------------

        ad *)
        und um das zu verstehen, müsste ich deinen Code (XML und XSL) oder Teile davon sehen und wissen, was du als Ausgabe haben willst.
        Der Code den du bisher gepostet hast ist viel zu bruchstückhaft und zu "verbeispielt", als das ich damit was anfangen könnte.
        Zudem ergibt der "Satz": "da sich ja der abstand zum inhaber proportional ändert" für mich keinen Sinn.
        Es müssen keine Echtdaten in deinem code stehen, aber der code sollte schon der sein, den du verwendest.
        Was deine Befürchtung angeht "da meine pfade sehr komplex sind und so sicher keiner auf anhieb verstanden hätte" ... tja, (ich meine es gar nicht böse, aber) wenn du uns den nötigen Schverstand von Vornherein abspricht, kann keiner von uns dir bei dem Problem helfen.

        Grüße
        Thomas