Announcement

Collapse
No announcement yet.

Sortierung per XSLT + JavaScript

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • Sortierung per XSLT + JavaScript

    Hallo,
    ich habe folgendes Problem, bei dem mir selbst ein Infoprof nicht weiterhelfen konnte:

    Mittels XSLT verarbeite ich im Firefox oder IE eine XML.
    Ich schreibe eine Tabelle aus den XML Daten, die wie im Folgenden erzeugt wird:


    HTML Code:
    <table id="error" class="tabelle_2" width="100%" border="0" cellpadding="6" cellspacing="6">
    					  <thead>
    						  <tr>
    							<th width="70%" class="zweite_Tabelle">Prüf-Kriterium</th>
    							<th width="9%" class="zweite_Tabelle">Fehler- Kennung</th>
    							<th width="9%" class="zweite_Tabelle">Fehler- Anzahl</th>
    							<th width="10%" class="zweite_Tabelle">Fehler- Korrektur</th>
    						  </tr>
    					  </thead>
    					  <tbody>
    					  
    						<xsl:apply-templates select="CheckAnalysis/AnalysisTree/TreeNode">
    						<xsl:sort select="@name" />
    						</xsl:apply-templates>
    						
    					  </tbody>
    					</table>
    Im Template, dass ich hier über "apply-templates" anspreche steht Folgendes:

    HTML Code:
    <xsl:template match="CheckAnalysis/AnalysisTree/TreeNode">	
    	
    <tr>
      <td>
    	<xsl:variable name="color" select="@color" /> 
    	  <xsl:choose>
    	  <xsl:when test="$color = '00DC00'">
    	  <img src="images/c_red.gif" />&nbsp;
    	  </xsl:when>
    	  <xsl:when test="$color = '0000FF'">
    	  <img src="images/c_blue.gif" />&nbsp;
    	  </xsl:when>
    	   <xsl:when test="$color = 'FF4000'">
    	  <img src="images/c_green.gif" />&nbsp;
    	  </xsl:when>
    	  <xsl:otherwise>
    	  <img src="images/c_green.gif" />&nbsp;
    	  </xsl:otherwise>
    	  </xsl:choose>
    	  <xsl:value-of select="@name"/>
    	  
      </td>
     
      <td class="rechtsb">
    	  <xsl:value-of select="@weightValue"/>
      </td>
      <td class="rechtsb">
    	  <xsl:value-of select="@numberOfMarked"/>
      </td>
      <td class="rechtsb">
    	  
    	  <xsl:variable name="healing" select="@healStatus" />
    	  <xsl:choose>
    		  <xsl:when test="$healing = '0'">
    			  <xsl:text>-</xsl:text>
    		  </xsl:when>
    		  <xsl:otherwise>
    			  <xsl:value-of select="@healStatus"/>
    		  </xsl:otherwise>
    	  </xsl:choose>
      </td>
     
    </tr>
    
    <xsl:if test="TreeNode">
    <script language="javascript">
    
    			//Tabellenzeilen ein- und ausblenden *****************************************
    			
    			function verstecken() {
    			var allElems = document.getElementsByTagName('*'); 
    			//bei * werden alle tags angesprochen, die den clannName haben (s.u.) ********
    			for <![CDATA[(var i = 0; i < allElems.length; i++)]]> {  
    			//CDATA, damit der Parser nicht auf XML Konformität prüft!!! *****************
    			var thisElem = allElems[i];
    			if (thisElem.className == 'elemente') {
    			thisElem.style.display = 'none';
    			}
    			}
    			}
    			
    			function anzeigen() {
    			//bei * werden alle tags angesprochen, die den clannName haben (s.u.) ********
    			var allElems = document.getElementsByTagName('*'); 
    			for <![CDATA[(var i = 0; i < allElems.length; i++)]]> {
    			var thisElem = allElems[i];
    			
    			//Browserweiche für Befehl display:table-row - kennt IE nicht ****************
    			if (thisElem.className == 'elemente') {
    			
    			if (navigator.appName.indexOf("Explorer") != -1)
    					{
    					thisElem.style.display = 'block';
    					}
    				else
    					{
    					thisElem.style.display = 'table-row';
    					}
    			}
    			}
    			}
    			
    </script>
    	
    	<xsl:for-each select="TreeNode">
    		
            <tr class="elemente" style="display:none;">
    			<td class="color">
    				&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
    				<xsl:value-of select="@name"/>
    			</td>
                <td class="rechtsb color">
    				<xsl:value-of select="@weightValue"/>
    			</td>
                <td class="rechtsb color">
    				<xsl:value-of select="@checkResult"/>
    			</td>
    		
            <td class="rechtsb color">
    	  
              <xsl:variable name="healing_2" select="@healResult" />
              <xsl:choose>
                  <xsl:when test="$healing_2 = '0'">
                      <xsl:text>-</xsl:text>
                  </xsl:when>
                  <xsl:otherwise>
                      <xsl:value-of select="@healResult"/>
                  </xsl:otherwise>
              </xsl:choose>
      		</td>
            
            </tr>
            
    	</xsl:for-each>
    
    </xsl:if>
    	
    </xsl:template>
    Jetzt möchte ich per JavaScript die Zeile <xsl:sort select="@name" /> (zu sehen im oberen Code-Fenster) ändern, so dass ich z.B. auf einen Button klicke und dieser das @name in z.B.: @weightValue ändert.
    Über eine XSL-Variable scheint dies nicht möglich zu sein - da nach dem select nur XPATH-konforme Ausdrücke angenommen werden. Dass ist zumindest mein Kenntnisstand bis jetzt.
    Hat da irgendjemand eine Idee? Wäre sehr dankbar für eine Lösung oder ein Denkansatz.

    LG
    Jan

  • #2
    @name bzw. @weightValue lassen sich auch formulieren als attribute::*[local-name() = 'name'] bzw. attribute::*[local-name() = 'weightValue']. Insofern müsste ein Parameter an das Script übergeben werden, der die Zeichenketten 'name' bzw. 'weightValue' enthält und dann dynamisch zugewiesen werden: <xsl:sort select="attribute::*[local-name() = $param]" />.

    Comment

    Working...
    X