Benjamin: Variable an XSL-Code übergeben

Ich hatte hier:

http://forum.de.selfhtml.org/?t=186456&m=1238327

Mein Problem schonmal unter dem Themenbereich "xsl" adressiert. Nach ein bisschen probieren ist das ganze wohl besser hier aufgehoben.

Folgendes:

meine XML-Datei sieht in etwa so aus:

<table>  
  <Rep>Max</Rep>  
  <datum>15.4.</datum>  
</table>  
<table>  
  <Rep>Max</Rep>  
  <datum>14.4.</datum>  
</table>  
<table>  
  <Rep>Martin</Rep>  
  <datum>11.02.</datum>  
</table>

Ich hab eine Auswahlliste aus dieser xml-Datei erzeugt und übergebe den gewählten Wert an eine Javascriptfunktion:

<form name="auswahl">  
 <select name="person" size="1" >  
  <xsl:for-each select="table/[generate-id() = generate-id(key('Rep', Rep)[1])]">  
	<xsl:element name="option">  
		<xsl:attribute name="value">  
			<xsl:value-of select="Rep"/>  
		</xsl:attribute>  
		<xsl:value-of select="Rep"/>  
	</xsl:element>						  
   </xsl:for-each>  
 </select>							  
 <input type="button" value="Go" onClick=			  
  "test(document.auswahl.person.value)"/>  
</form>

Ich möchte nun in der Funktion den Wert vergleichen mit dem "Rep"-Element und mir einfach alle Datumsangaben ausgeben lassen. Das ganze versuche ich wiefolgt:

<script language="JavaScript">  
function test(erg){  
document.write("<xsl:for-each select='report/tables/table'>");  
document.write("<xsl:if test='Rep = " + erg + "'><xsl:value-of select='Date'/></xsl:if>");  
document.write("</xsl:for-each>");  
}  
</script>

Das Problem ist: ich bekomme den Wert der Variable "erg" nicht wieder in die Test-Funktion hinein. Ich weiß nicht, wie ich die Variable maskieren kann.. kann mir jemand helfen?

Gruß
Benjamin

  1. Hallo,

    http://forum.de.selfhtml.org/?t=186456&m=1238327

    Mein Problem schonmal unter dem Themenbereich "xsl" adressiert. Nach ein bisschen probieren ist das ganze wohl besser hier aufgehoben.

    meine XML-Datei sieht in etwa so aus:

    so weit so gut.

    Ich hab eine Auswahlliste aus dieser xml-Datei erzeugt und übergebe den gewählten Wert an eine Javascriptfunktion:

    <form name="auswahl">

    <select name="person" size="1" >
      <xsl:for-each select="table/[generate-id() = generate-id(key('Rep', Rep)[1])]">

    </xsl:for-each>
    </select>
    <input type="button" value="Go" onClick=
      "test(document.auswahl.person.value)"/>
    </form>

      
    so weit auch so gut, vorausgesetzt: du hast eine XSL-Datei!?  
      
    
    > Ich möchte nun in der Funktion den Wert vergleichen mit dem "Rep"-Element und mir einfach alle Datumsangaben ausgeben lassen. Das ganze versuche ich wiefolgt:  
    >   
    > ~~~javascript
    
    <script language="JavaScript">  
    
    > function test(erg){  
    > document.write("<xsl:for-each select='report/tables/table'>");  
    > document.write("<xsl:if test='Rep = " + erg + "'><xsl:value-of select='Date'/></xsl:if>");  
    > document.write("</xsl:for-each>");  
    > }  
    > </script>
    
    

    Das Problem ist: ich bekomme den Wert der Variable "erg" nicht wieder in die Test-Funktion hinein. Ich weiß nicht, wie ich die Variable maskieren kann.. kann mir jemand helfen?

    Was soll das sein?
    Warum schreibst du das XSLT plötzlich mit JavaScript und vor allem wohin schreibst du das?
    Dir ist schon klar wie XML/XSL-Transformation in Grundzügen funktioniert?
    Dir ist schon klar, dass nach einer XML/XSL-Trnaformation du im Browser HTML hast?

    Grüße
    Thomas

    1. Was soll das sein?
      Warum schreibst du das XSLT plötzlich mit JavaScript und vor allem wohin schreibst du das?
      Dir ist schon klar wie XML/XSL-Transformation in Grundzügen funktioniert?
      Dir ist schon klar, dass nach einer XML/XSL-Trnaformation du im Browser HTML hast?

      Grüße
      Thomas

      Hallo Thomas,

      danke für die Antwort. Ich weiß, das war Murks. Ich versuch mich gerade in die alten Beispiele (Tourdaten - http://www.datenverdrahten.de/iproxslt/tourdaten/iejs/index.htm) von T.Meinike und dir reinzuarbeiten. Ich habe nur null Ahnung von Javascript.. und kann das verwendete Beispiel auch nicht nachstellen :(

      1. Hallo,

        danke für die Antwort. Ich weiß, das war Murks. Ich versuch mich gerade in die alten Beispiele (Tourdaten - http://www.datenverdrahten.de/iproxslt/tourdaten/iejs/index.htm) von T.Meinike und dir reinzuarbeiten. Ich habe nur null Ahnung von Javascript.. und kann das verwendete Beispiel auch nicht nachstellen :(

        Du kannst ja gezielt Fragen zu den Beispielen stellen ;-)

        Grüße
        Thomas

        1. Du kannst ja gezielt Fragen zu den Beispielen stellen ;-)

          Grüße
          Thomas

          Guter Plan ;)

          Wie fang ich am Besten an..

          Also, das oben genannte Beispiel: http://www.datenverdrahten.de/iproxslt/tourdaten/iejs/index.htm

          Die Indexdatei besteht aus 2 Frames:
          auswahl.htm
          ausgabe.htm

          Wenn ich mir die Auswahlliste in der Auswahl.xsl Datei nach meinen Bedürfnissen umstricke und mit meinen xml Daten bestücke, anschließend "transformiere" - müsste ich meine Auswahlliste ja über die Index.htm sehen.. das passiert aber nicht, ich sehe gar nix. Wenn ich allerdings die transformierte Auswahl.htm Datei öffne, erscheint wunderschön meine Auswahlliste.. nur in die Index seite bekomme ich sie nicht.. Dazu stellt sich mir gleich die Frage für was ich diese convert-xml-xsl-html.htm Datei benötige? Muss ich jedesmal, wenn sich meine XML Daten ändern, die Auswahlliste neu transformieren? Macht der IE das nicht automatisch?

          1. Hallo,

            Also, das oben genannte Beispiel: http://www.datenverdrahten.de/iproxslt/tourdaten/iejs/index.htm

            Die Indexdatei besteht aus 2 Frames:
            auswahl.htm
            ausgabe.htm

            Wenn ich mir die Auswahlliste in der Auswahl.xsl Datei nach meinen Bedürfnissen umstricke und mit meinen xml Daten bestücke, anschließend "transformiere" - müsste ich meine Auswahlliste ja über die Index.htm sehen.. das passiert aber nicht, ich sehe gar nix.

            Dazu müsste man deinen XML und XSL sehen und du darfst nicht vergessen, dass im den JavaScript, der die Transformation macht bestimmte Sachen aus dem XSL abgefragt werden. Bzw. was meinst du, wenn du sagst "transformiere" ? Womit?

            »»Wenn ich allerdings die transformierte Auswahl.htm Datei öffne, erscheint wunderschön meine Auswahlliste.. nur in die Index seite bekomme ich sie nicht.. Dazu stellt sich mir gleich die Frage für was ich diese convert-xml-xsl-html.htm Datei benötige? Muss ich jedesmal, wenn sich meine XML Daten ändern, die Auswahlliste neu transformieren? Macht der IE das nicht automatisch?

            Am besten stellst du ein Beispiel irgendwo online, denn so ist es etwas schwierig sich über den Code zu unterhalten :)

            Grüße
            Thomas

            1. Ok, ich werd mal konkret:

              Ich hab eine xml Datei die in etwa so aussieht:

               <table prefix="B2">  
                	<Rep fieldno="157" fid="157">Mustermann, Max</Rep>  
               	 <Date fid="2">20090427</Date>  
                	<RepIDfid="3">010000028</RepID>  
                	<Dep.Timefid="6">730</Dep.Time>  
              ......  
               	<tables>  
              		 <table tableshort="B4" prefix="B4" recid="588410520972">  
              			  <ReceiptType>019</ReceiptType>  
              			  <Thema>Thema1</Thema>  
              			  <Amount fieldno="7" fid="7">0.00</Amount>  
              	  	</table>  	  
              	</tables>  
                </table>  
               <table prefix="B2">  
                	<Rep fieldno="157" fid="157">Mustermann, Max</Rep>  
               	 <Date fid="2">20090428</Date>  
                	<RepIDfid="3">010000028</RepID>  
                	<Dep.Timefid="6">730</Dep.Time>  
              ....  
              </table>  
               <table prefix="B2">  
                	<Rep fieldno="157" fid="157">Schmidt, Jürgen</Rep>  
               	 <Date fid="2">20090427</Date>  
                	<RepIDfid="3">010000028</RepID>  
                	<Dep.Timefid="6">730</Dep.Time>  
              ....  
              </table>
              

              In der xml stehen eine Reihe von "Rep" personen. Ich habe für jede jetzt eine Übersicht in der in jeder Zeile die Informationen für einen Besuchen stehen (die Informationen aus jedem "table" mit dem prefix="B2" und der untergeordneten Tabelle "B4"). Das klappt alles auch prima.
              hier ein Teil:

                
              <xsl:for-each select="table[@tableshort = 'B2']">  
              	<!--Date-->  
              <td class="Record">  
              		<xsl:value-of select="substring(Date,7,2)"/><xsl:text>.</xsl:text>  
              		<xsl:value-of select="substring(Date,5,2)"/><xsl:text>.</xsl:text>  
              	</td>  
              	<!—Anfangszeit-->  
              	<td class="Record" width="40px">  
              		<xsl:variable name="DepTime">  
              				<xsl:value-of select="Dep.Time"/>  
              		</xsl:variable>  
              		<xsl:if test="string-length(Dep.Time) = 3">  
              			<xsl:text>0</xsl:text>  
              			<xsl:value-of select="substring($DepTime,1,1)"/>  
              			<xsl:text>:</xsl:text>  
              			<xsl:value-of select="substring($DepTime,2,2)"/>  
              		</xsl:if>  
              		<xsl:if test="$DepTime = 0">  
              			<xsl:text>00:00</xsl:text>  
              		</xsl:if>  
              		<xsl:if test="string-length($DepTime) = 4">  
              			<xsl:value-of select="substring($DepTime,1,2)"/>  
              			<xsl:text>:</xsl:text>  
              			<xsl:value-of select="substring($DepTime,3,2)"/>  
              		</xsl:if>	  
              	</td>  
              </xsl:for-each>  
              usw.  
              
              

              ----
              Soweit so gut. Ich will nur jetzt am Anfang auswählen welche Person ("Rep") ich mir anzeigen lasse. Die Auswahlliste bekomm ich auch schon wunderschön hin.. Es werden alle Rep auch nur einmalig angezeigt:

              <form name="auswahl">  
               <select name="person" size="1" >  
                <xsl:for-each select="table/[generate-id() = generate-id(key('Rep', Rep)[1])]">  
                      <xsl:element name="option">  
                              <xsl:attribute name="value">  
                                      <xsl:value-of select="Rep"/>  
                              </xsl:attribute>  
                              <xsl:value-of select="Rep"/>  
                      </xsl:element>  
                 </xsl:for-each>  
               </select>  
               <input type="button" value="Go" onClick=  
                "test(document.auswahl.person.value)"/>  
              </form>
              

              Nun müsste ich, wenn ich alles richtig verstanden habe eine neue Seite aufrufen/erstellen, die wieder die xml Datei einließt und eine xsl Datei aufruft (mit dem Code von oben). Richtig? Das ganze muss auch Clientseitig erfolgen.. Ich hab wie gesagt mit dem Tourdaten-Code schon rumgespielt - da kam aber nix bei rum :(

              Gruß
              Benjamin

              1. Hallo Benjamin,

                Das ganze muss auch Clientseitig erfolgen.. Ich hab wie gesagt mit dem Tourdaten-Code schon rumgespielt - da kam aber nix bei rum :(

                Das (schon recht alte) IE-Beispiel liegt ja quelloffen vor und übergibt aus dem oberen Frame-Inhalt (der selbst mit XSLT clientseitig entsteht) eine xsl:variable mit dem ausgewählten Bandnamen an das XML-DOM im unteren Frame. Dort wird dann mittels JS die Transformation ausgeführt.

                Mehr kann ich eigentlich gar nicht dazu sagen.

                Grüße,
                Thomas

                1. Das (schon recht alte) IE-Beispiel liegt ja quelloffen vor und übergibt aus dem oberen Frame-Inhalt (der selbst mit XSLT clientseitig entsteht) eine xsl:variable mit dem ausgewählten Bandnamen an das XML-DOM im unteren Frame. Dort wird dann mittels JS die Transformation ausgeführt.

                  Mehr kann ich eigentlich gar nicht dazu sagen.

                  Grüße,
                  Thomas

                  Gut, nur das ganze funktioniert bei mir schon nicht, wenn ich die Daten in der XML ändere.. und da liegt für mich das Problem..

                  1. Hallo Benjamin,

                    Gut, nur das ganze funktioniert bei mir schon nicht, wenn ich die Daten in der XML ändere.. und da liegt für mich das Problem..

                    Klappt Dein Vorhaben denn überhaupt? Teste zunächst mal mit der direkten Vorgabe von Variable/Parameter im XSLT-Code:

                    <!-- global - unterhalb von xsl:stylesheet, alternativ mit xsl:param -->  
                    <xsl:variable name="Bx" select="'B2'"/>  
                      
                    <!-- im relevanten Template -->  
                    <xsl:for-each select="table[@tableshort = $Bx]">  
                      <!-- ... -->  
                    </xsl:for-each>
                    

                    Dann sollte die Übergabe auch via JS möglich sein.

                    Grüße,
                    Thomas

                    1. Hallo Benjamin,

                      »

                      Klappt Dein Vorhaben denn überhaupt? Teste zunächst mal mit der direkten Vorgabe von Variable/Parameter im XSLT-Code:

                      »»

                      Grüße,
                      Thomas

                      Hallo Thomas,

                      mein Vorhaben klappt prinzipiell. Ich kann einer Variable einen festen Wert zuweisen (z.B. Mustermann, Max) und er gibt mir dann nur die Ergebnisse von Max Mustermann wieder. Der Rest der xml - Datei wird links liegen gelassen. Ich habe mit dem Beispiel wie erwähnt nur ein Verständnisproblem: Was passiert, wenn die Daten der xml Datei geändert werden (z.B. Band wird ausgetauscht)? Der IE sollte dann dann ja eigentlich die Änderung der "Band" übernehmen, aber das funktioniert schon nicht.. Ich steh irgendwie total auf dem Schlauch.

                      1. Hallo Benjamin,

                        Was passiert, wenn die Daten der xml Datei geändert werden (z.B. Band wird ausgetauscht)? Der IE sollte dann dann ja eigentlich die Änderung der "Band" übernehmen, aber das funktioniert schon nicht.. Ich steh irgendwie total auf dem Schlauch.

                        Ok, ich verstehe (ist ja fast 7 Jahre her ;-). Die Auswahlliste aktualisiert sich nicht selbst sondern auswahl.htm ist bereits durch statische Transformation von tourdaten.xml mit auswahl.xsl entstanden. Nur das DOM von ausgabe.htm wird dynamisch befüllt. Insofern müsste für weitere Dynamik auch im oberen Frame die Auswahlliste über JS erzeugt werden.

                        Grüße,
                        Thomas