progi: Vergleich, Farblich hervorheben

Hallo zusammen,

ich habe in einer xml-Datei zwei tabellen. Die Tabellen haben gleiche Attribute, nur dass die Werte unterschiedlich sein können.

Ich habe es auch schon geschafft die beiden Tabellen zu vergleichen, doch leider noch nicht so, dass sie mit einer anderen Farbe hervorgehoben werden.

<?xml version="1.0" encoding="ISO-8859-1"?>  
<?xml-stylesheet type="text/xsl" href="test.xsl"?>  
  
<modul name="webtest">  
	<tabelle name="test">  
    <attribut1 name="feld1">test</attribut1>  
    <attribut2 name="feld2">test</attribut2>  
    <attribut3 name="feld3">asdf</attribut3>  
    <attribut4 name="feld4">test</attribut4>  
</tabelle>  
  
	<tabelle2 name="test">  
    <attribut1 name="feld1">test</attribut1>  
    <attribut2 name="feld2">test</attribut2>  
    <attribut3 name="feld3">test</attribut3>  
    <attribut4 name="feld4">test</attribut4>  
</tabelle2> 

Nun sollte attribut3 mit dem Namen feld3 farblich hervorgehoben werden.

Hier noch die xsl-Datei:

<?xml version="1.0"?>  
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">  
  <xsl:output method="html" encoding="ISO-8859-1"/>  
    <xsl:template match="/">  
<html>  
	<head>  
	  <title>Vergleichs Test</title>  
	  <style type="text/css" media="screen">  
    table {  
		background-color: lightblue;  
		margin: 1em;  
		padding: 1em;  
		border: 1px black  
		}  
    caption {  
		font-size: large;  
		background-color: lightblue;  
		border-bottom: 3px black }  
		tr:nth-of-type(even) {  
   	background-color:#ccc;  
 		}  
 		tr.markiert {  
  	background-color: yellow;	  
		}  
  
    </style>  
</head>  
  
  <body bgcolor="#ffffff">  
    <table width="180" border="1" cellspacing="2" cellpadding="0">  
	     <caption><b>Test</b> </caption>  
	     <xsl:call-template name="tabelle"/>  
    </table>  
  </body>  
</html>  
    </xsl:template>  
  
  
    <xsl:template name="tabelle">  
      <xsl:for-each select="//tabelle[1]/*">  
	<tr>  
	  <td>  
	    <xsl:value-of select="@name"/>  
	  </td>  
      	  <td>	  
            <xsl:value-of select="current()"/>  
 	  </td>  
  
	  <td>	  
	    <xsl:value-of select="/modul/tabelle2/*[local-name()=name(current())][@name=current()/attribute::name]"/>  
	    <xsl:if test="/modul/tabelle2/*[local-name()=name(current())][@name=current()/attribute::name]!=current()">  
              Ungleich  
	    </xsl:if>  
          </td>  
        </tr>  
      </xsl:for-each>  
    </xsl:template>  
		  
  
</xsl:stylesheet>

Dieser Code legt die Tabellen nebeneinander und vergleicht sie. Wie kann ich sie nun aber farblich hervorheben? Ich dachte mir, dass ich evtl mit javascript etwas erreichen könnte. Leider hab ichs nicht hingekriegt. Wie geht das? ist es überhaupt mit xml/xsl möglich?

Freundliche Grüsse

  1. Om nah hoo pez nyeetz, progi!

    Wenn die Tabellen eine identische Struktur haben, könnte folgedes zielführend sein

    Pseudocode - ungetestet

    ( function vergleich() {  
      
    var tabelle1 = document.getElementById(...);  
    var tabelle2 = ...  
    var tds1 = tabelle1.getElementsByTagName('td');  
    var tds2 = ...  
      
    for (var i = 0; i < tds1.length; i++) {  
      if (tds1[i].innerHTML != tds2[i].innerHTML) {  
        tds1[i].className = 'isdifferent';  
        tds2[i].className = 'isdifferent';  
      }  
    }  
      
    })
    

    Matthias

    --
    1/z ist kein Blatt Papier.

  2. Hallo,

    <td>
        <xsl:value-of select="/modul/tabelle2/*[local-name()=name(current())][@name=current()/attribute::name]"/>
        <xsl:if test="/modul/tabelle2/*[local-name()=name(current())][@name=current()/attribute::name]!=current()">
                  Ungleich
        </xsl:if>
              </td>
            </tr>
          </xsl:for-each>
        </xsl:template>

    <xsl:variable name="cellStyle">
      xsl:choose
        <xsl:when test="/modul/tabelle2/*[local-name()=name(current())][@name=current()/attribute::name]!=current()">background-color: #FF0000;</xsl:when>
        xsl:otherwisebackground-color: #000000;</xsl:otherwise>
      </xsl:choose>
    </xsl:variable>

    <td style="{$cellStyle}">
     <xsl:value-of select="/modul/tabelle2/*[local-name()=name(current())]
    </td>

    Viele Grüße
    Siri

    1. <td style="{$cellStyle}">
      <xsl:value-of select="/modul/tabelle2/*[local-name()=name(current())]
      </td>

      Besser wäre es natürlich, nicht den Style zu setzen, sondern eine Klasse!

    2. Hier hast du noch was kleines am schluss vergessen ;-)

      <xsl:value-of select="/modul/tabelle2/*[local-name()=name(current())]

      <xsl:value-of select="/modul/tabelle2/*[local-name()=name(current())]"/>

      Vielen Dank, hat geklappt :D

  3. Dieser Code legt die Tabellen nebeneinander und vergleicht sie. Wie kann ich sie nun aber farblich hervorheben? Ich dachte mir, dass ich evtl mit javascript etwas erreichen könnte. Leider hab ichs nicht hingekriegt. Wie geht das? ist es überhaupt mit xml/xsl möglich?

    Also du erzeugst über xsl eine Tabelle, und eine Spalte in der der Text "Ungleich" steht, wenn deine XML-Daten unterschiedlich sind.
    Dann verstehe ich nicht dein Problem, mit diesem Vergleich der Tabellenzeile auch eine Klasse zu verpassen.