XSL variable speichern und vergleichen

mmhhh

Grünschnabel
Hallo alle zusammen,

ich möchte gerne nur Checkboxen erzeugen lassen, wenn eine Komponente noch nicht angegeben ist. Oh je, irgendwie ist das nicht so eindeutig. Also in Java würde der Sachverhalt so aussehen:

Code:
int temp;
for(String komponente : komponenten){
    if(temp != null){
           if(!temp.equals(komponente)){
                 // erzeuge eine Checkbox mit genau dieser Komponente als Label
                 temp = komponente; 
            }	
     }
     else{
                 // erzeuge eine Checkbox mit genau dieser Komponente als Label
                 temp = komponente; 
     }
}

Also und dass will ich mit XSL. Meine XML sieht so aus:

Code:
  <?xml version="1.0" encoding="UTF-8" ?> 
- <Rowsets DateCreated="2009-04-09T10:43:30" EndDate="2009-04-09T10:43:26" StartDate="2009-04-09T09:43:26" Version="12.0.6 Build(12)">
- <Rowset>
- <Columns>
  <Column Description="" MaxRange="1" MinRange="0" Name="bla" SQLDataType="1" SourceColumn="bla" /> 
     </Columns>
- <Row>
  <bla>irgendwas</bla> 
   </Row>
  </Rowset>
- <Rowset>
- <Columns>
  <Column Description="" MaxRange="100" MinRange="0" Name="Komponente" SQLDataType="1" SourceColumn="Komponente" /> 
  <Column Description="" MaxRange="100" MinRange="0" Name="Menge" SQLDataType="4" SourceColumn="Menge" /> 
   </Columns>
- <Row>
  <Komponente>1316.084</Komponente> 
  <Menge>864</Menge> 
    </Row>
- <Row>
  <Komponente>1316.084</Komponente> 
  <Menge>432</Menge> 
    </Row>
- <Row>
  <Komponente>2222.222</Komponente> 
  <Menge>432</Menge> 
    </Row>
- <Row>
  <Komponente>2222.222</Komponente> 
  <Menge>432</Menge> 
    </Row>
  </Rowset>
  </Rowsets>

an dieser XML kann ich nichts mehr ändern. Und meine XSL in dem Bereich sieht so aus:

HTML:
<form id="form" action="seite" method="GET">
     <xsl:for-each select="Rowsets/Rowset[2]/Row">
          <span style="padding-left:0px; padding-top: 0px">
               <input type="checkbox" id="komponente">		
                   <label for="komponente"><xsl:value-of select="Komponente"/></label>	
               </input>
          </span>
          <span style="padding-left:30px">
               <select id="menge">
                   <xsl:for-each select="//Rowset[2]/Row">				<option value="Menge">					     <xsl:value-of select="Menge"/>					</option>
                   </xsl:for-each>
               </select>
          </span>
     </xsl:for-each> 
     <span style="padding-left:40px">
          <input id="buttonOK" type="submit" value="OK"/>
     </span>		
</form>

Meine Frage ist, ob es möglich ist den obigen Java-Code in XSL zu schreiben, wenn ja wie? Und wenn nein, kann ich das irgendwie mit Javascript machen und wenn ja wie und wie würde ich es dann in die XSL wieder einbinden.

MfG
 
Hi.

Prinzipiell geht das. Allerdings solltest du versuchen besser zu beschreiben was du überhaupt willst. Was konkret soll denn nachher (ausgehend von deinem Beispiel) herauskommen?

XML:
<xsl:for-each select="Rowsets/Rowset[2]/Row">
  <xsl:variable name="k" select="Komponente" />
  <xsl:if test="preceding-sibling::Row/Komponente[text() != $k]">
    ...
  </xsl:if>
<xsl:for-each>
Gruß
 
Zuletzt bearbeitet von einem Moderator:
Hallo,

erstmal vielen Dank das du mir antwortest. Ja, du hast recht es ist doch sehr schlecht formuliert. Ich versuch mal mein Problem anderst zu erklären.

Also, ich habe die XML Datei wie im Anhang. Aus dieser XML Datei lese ich die Komponenten und die Mengen aus. Ich möchte, dass mir diese Daten so angezeigt werden: checkbox mit Komponente als Label und dahinter eine Drop Downbox mit der Menge. Nun wird mir das auch alles ausgegeben auf meiner seite. Aber es ist so, dass eine Komponente verschiedene Mengen haben kann. In der XML steht daher, eine Komponente in mehreren Rows. Also wird mir jede Komponente so oft ausgegeben, wie sie auch in der XML steht. Z.B. hats dann

Checkbox Komponente: Schrauben Menge: 10;
Checkbox Komponente: Schrauben Menge: 50;

Checkbox Komponente: Schraubenschlüssel Menge: 100;

Checkbox Komponente: Schraubenschlüssel Menge: 500; usw



ich habe es nun hinbekommen, dass es 'nur' noch so steht:

Checkbox Komponente: Schrauben 10, 50 (die werte stehen in einer drop down drin);
Checkbox Komponente: Schrauben 10, 50;

Checkbox Komponente: Schraubenschlüssel 100, 500;

Checkbox Komponente: Schraubenschlüssel 100, 500; usw

Jetzt möchte ich, dass es so da steht:

Checkbox Komponente: Schrauben 10, 50;

Checkbox Komponente: Schraubenschlüssel 100, 500;

Also, das jede Komponente nur einmal ausgegeben wird. Die Komponenten kann ich aus der XML auslesen, aber es kann immer etwas anderes sein und es kann auch immer eine andere anzahl an Komponenten sein (z.B. brauch ich für den bau eines motors andere Komponenten als für den bau eines getriebes) ebenso sind für jeden Fall die Anzahl der Mengen anderst. Mal hab ich auswahl zwischen 2 Mengen, mal gibts nur 1 oder auch mal 7 oderso.

Ich versuch gleich mal deinen Vorschlag. Danke......



Liebe Grüße
 
Hallo alle zusammen,

ich dachte das das Problem gelöst ist.......... Leider funktioniert es nicht so ganz wie ich es möchte. :(
Und zwar wird es bei einer kleinen Menge von Komponenten zwar richtig angezeigt, aber bei einer größeren Menge,z.B. 500, werden mehrere gleiche Komponenten angezeigt.
Also hab ich mich umgesehen und habe folgendes versucht:

Code:
<form id="form" action="seite" method="GET">
     <xsl:for-each select="Rowsets/Rowset[2]/Row">
       <xsl:if test="preceding-sibling::*[Row/Komponente[text()!= $temp]]">
          <span>
               <input type="checkbox" id="komponente">		
                   <label for="komponente"><xsl:value-of select="Komponente"/></label>	
               </input>
          </span>
          <span>
               <select id="menge">
                   <xsl:for-each select="//Rowset[2]/Row">
	      <option value="Menge">		
	          <xsl:value-of select="Menge"/>
                           </option>
                   </xsl:for-each>
               </select>
          </span>
       </xsl:if>
     </xsl:for-each> 
     <span>
          <input id="buttonOK" type="submit" value="OK"/>
     </span>		
</form>

So, dann wird nur noch eine einzige Komponente angezeigt und mir ist aufgefallen, dass es überhaupt gar nicht das farbige überprüft.
Ich habe auch gelesen, dass
<xsl:for-each> ist keine iterative Schleife, bei den es Schleifenschritte und ein Davor vor dem aktuellen Schleifenschritt oder ein Danach gibt. Die Reihenfolge der Ausführung von for-each kann man nicht beeinflussen, es ist wurst, ob das gleichzeitig oder nacheinander oder ganz durcheinander geschieht.
siehe http://forum.de.selfhtml.org/archiv/2007/8/t158279/

Und bin jetzt komplett verwirrt!!:eek:
Also wie kann ich mein schon oben beschriebenes Problem nun lösen Hat jemand einen kleinen Tipp für mich Wäre echt super.......

Gruß
 
Hi.

Das ist alles noch äußerst diffus was du da von dir gibst. Mach doch mal bitte ein richtiges (Minimal) Beispiel (xml, xsl Datei) und erstelle ausgehend von diesen Daten dann eine html Datei wo man dann sehen kann was konkret für ein Resultat herauskommen soll.

Und was meinst du mit "gar nicht das farbige überprüft."? :confused:

Gruß
 
Hallo

danke schön. Mit dem farbigen meine ich das $temp was in einem zugegeben ziemlich hässlichem pink da steht. Egal.
Also ich lese aus einer XML Datei die Komponenten und die Mengen aus. Ich möchte, dass mir diese Daten so angezeigt werden:
[] Schraube 10 <-- die 10 ist dabei in einer Drop down box drin.
[] Schraubenzieher 50

Die XML Datei sieht minimal so aus:
Code:
<?xml version="1.0" encoding="UTF-8" ?> 
<Rowsets Version="12.0.7 Build(17)">
<Rowset>
<Row>
<Username>mmhhh</Username> 
<Kopfmaterial>Schraube</Kopfmaterial> 
</Row>
</Rowset>
<Rowset>
<Row>
<Komponente>Schraube</Komponente> 
<Menge>94</Menge> 
</Row>
<Row>
<Komponente>Schraube</Komponente> 
<Menge>72</Menge> 
</Row>
<Row>
<Komponente>Schraubenzieher</Komponente> 
<Menge>54</Menge> 
</Row>
<Row>
<Komponente>Schraubenzieher</Komponente> 
<Menge>36</Menge> 
</Row>
</Rowset>
</Rowsets>

die xsl Datei sieht so aus:
Code:
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="html" media-type="text/html" doctype-public="-//W3C//DTD HTML 4.01 Transitional//EN" doctype-system="http://www.w3.org/TR/html4/loose.dtd" encoding="UTF-8"/>

<xsl:template match="/">
    <html>
       <head>
          <title>Komponenten </title>
             <script src="komponenten.js" type="text/javascript"></script>
       </head>
       <body>
          <p> Material:<xsl:value-of select="Rowsets/Rowset[1]/Row/Kopfmaterial"/>
          </p>

          <form id="form" method="GET" action="irgendwas">
             <xsl:if test="Rowsets/Rowset[2]/Row/Komponente"> 
                 <span>
                     <input type="checkbox" id="komponente">
                          <label for="komponente" id="komponentenLabel">
                                  <xsl:value-of select="Rowsets/Rowset[2]/Row/Komponente"/>
                          </label>		
                     </input>
                  </span>

                 <span>
                    <select id="menge">
                        <xsl:for-each select="//Rowset[2]/Row">
                           <option> 
                               <xsl:value-of select="Menge"/>
                           </option>
                        </xsl:for-each>
                    </select>
                 </span>
              </xsl:if>
          <xsl:variable name="temp" select="Rowsets/Rowset[2]/Row/Komponente[1]"/> 

          <xsl:for-each select="Rowsets/Rowset[2]/Row">
            <xsl:if test="not(preceding-sibling::Row/Komponente[text()!=$temp])">
                <span>
                     <input type="checkbox" id="komponente">
                          <label for="komponente" id="komponentenLabel">
                                  <xsl:value-of select="Rowsets/Rowset[2]/Row/Komponente"/>
                          </label>		
                     </input>
                  </span>

                 <span>
                    <select id="menge">
                        <xsl:for-each select="//Rowset[2]/Row">
                           <option> 
                               <xsl:value-of select="Menge"/>
                           </option>
                        </xsl:for-each>
                    </select>
                 </span>
              </xsl:if>
           </xsl:for-each> 
       </form>
       <xsl:apply-templates/>
    </body>
  </html>
</xsl:template>

<xsl:template match="Username">
</xsl:template> 
<xsl:template match="Kopfmaterial">
</xsl:template> 
<xsl:template match="Komponente">
</xsl:template>
<xsl:template match="Menge">
</xsl:template> 
</xsl:stylesheet>

So, nun möchte ich, dass die Schraube nur einmal dran steht und alle ihre Mengen in ihrer Dropdown Box stehen. Und dass nur einmal der Schraubenzieher dran steht und alle seine Mengen in seiner daneben stehen den Dropdown Box stehen.
(Die zahlen stehen alle untereinander in der DropDown Box)
Also so aussehen:
[] Schraube 94
72

[] Schraubenzieher 54
36

Problem:
Bei niedrigen angeforderten Mengen steht es so da:
[] Schraube 94
72
54
36

[] Schraubenzieher 94
72
54
36
Also die Mengen sind NICHT nach Komponenten getrennt. Das ist das eine Problem. Das größere Problem ist:
Bei größeren angeforderten Mengen (z.B.500) steht es so da:
[] Schraube 94
72
420
54
36
350

[] Schraube 94
72
420
54
36
350

[] Schraube 94
72
420
54
36
350

[] Schraube 94
72
420
54
36
350

[] Schraubenzieher 94
72
420
54
36
350

[] Schraubenzieher 94
72
420
54
36
350

[] Schraubenzieher 94
72
420
54
36
350

Also wie bekomme ich es hin, dass es NUR noch einfach dran steht?
Vielen dank schon mal im voraus für eure Bemühungen.

Gruß mmhhh
 
Zuletzt bearbeitet:
Hi.
Hallo

danke schön. Mit dem farbigen meine ich das $temp was in einem zugegeben ziemlich hässlichem pink da steht. Egal.
Also ich lese aus einer XML Datei die Komponenten und die Mengen aus. Ich möchte, dass mir diese Daten so angezeigt werden:
[] Schraube 10 <-- die 10 ist dabei in einer Drop down box drin.
[] Schraubenzieher 50
Waren meine Worte irgendwie unverständlich? Jetzt fängst du ja schon wieder an Romane zu schreiben ohne mal konkret die Dateien zu präsentieren.

Wenn du keine Lust hast mal wenigstens das Problem adäquat zu erklären und einfach mal ausgehend von einem konkreten Beispiel die Resultate zu zeigen und dein Problem zu erläutern, dann hab ich eigentlich auch keine große Lust dir zu helfen.

Da passt ja überhaupt nichts zusammen. Deine XML Datei ist nicht valide. Was sollen die Bindestriche da? Warum muß ich die jetzt erst noch entfernen? Warum kannst du nicht einfach die Datei speichern, oder einfach die Striche entfernen wenn du es schon aus dem IE herauskopierst... :mad:

Dann hast du eine innere foreach-Schleife in der du alle Mengen aus der Datei ausgibst. Was erwartest du denn was dann passiert? Natürlich werden alle Mengen ausgegeben.

Wenn du nur alle Mengen von Schrauben ausgeben willst, dann mußt du die Menge entsprechend filtern:
XML:
<xsl:for-each select="//Rowset[2]/Row[./Komponente = string($temp)]">
...
</xsl:for-each>
Außerdem ist dein HTML Code nicht valide. IDs sind eindeutige Identifizierer - d.h. jede ID darf genau einmal im gesamten Dokument vorkommen. Und ein label Element darf nicht innerhalb eines input Elementes stehen. Vielmehr muss ein input Element leer sein.

Gruß
 
Zuletzt bearbeitet von einem Moderator:
Zurück