SHT16freak: Mit XSL zwei Tabellen in XML vergleichen

Hallo zusammen

Ich bin newcomer im Sachen XML/XSL und komm bei meinem Problem hier nicht weiter. Ich hoffe Ihr könnt mir bei meinem Problem helfen.

Ich habe eine XML-Datei mit zwei Tabellen. Das XML (MBeans.xml) ist sehr simpel aufgebaut: ~~~xml <?xml version="1.0" encoding="ISO-8859-1"?>
<?xml-stylesheet type="text/xsl" href="MBeans.xsl"?>

<modul name="jboss.web">
  <mbean name="jboss.web">
    <attribut1 name="trustStoreType">test</attribut1>
    <attribut2 name="port">8080</attribut2>
    <attribut3 name="redirectPort">8443</attribut3>
    <attribut4 name="maxHttpHeaderSize">8192</attribut4>

</mbean>

<mbean2 name="jboss.web">
    <attribut1 name="trustStoreType">null</attribut1>
    <attribut2 name="port">8080</attribut2>
    <attribut3 name="redirectPort">8443</attribut3>
    <attribut4 name="maxHttpHeaderSize">8192</attribut4>

</mbean2>
</modul>

  
Mit meiner XSL-Datei hab ich es mal hingekriegt, dass ich beide Tabellen angezeigt bekomme. Die beiden Tabellen in der XML-Datei sind gleich aufgebaut, auch die Reihenfolge der Attribute sind gleich. Nur hab ich es geschafft die beiden Tabellen untereinander zu setzen.  
  
XSL-Datei (MBeans.xsl):  
  
~~~xml
<?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>MBeans</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;  
 		}  
         caption2 {  
		font-size: large;  
		background-color: lightblue;  
		border-bottom: 3px black }  
		tr:nth-of-type(even) {  
   	        background-color:#ccc;  
 		}  
         </style>  
      </head>  
  
  <body bgcolor="#ffffff">  
    <table width="180" border="1" cellspacing="2" cellpadding="0">  
	     <caption><b>MBeans</b> "jboss.web:type=Connector,port=8080,address=%2F10.5.44.21"</caption>  
	     <xsl:call-template name="tabelle"/>  
	  </table>  
	  <table width="180" border="1" cellspacing="2" cellpadding="0">  
	     <caption2><b>MBeans2</b> "jboss.web:type=Connector,port=8080,address=%2F10.5.44.21"</caption2>  
	     <xsl:call-template name="tabelle2"/>  
	  </table>  
	</body>  
      </html>  
    </xsl:template>  
  
  
    <xsl:template name="tabelle">  
	<xsl:for-each select="//mbean[1]/*">  
	  <tr>  
	     <td>  
		<xsl:value-of select="@name"/>  
	     </td>  
      	     <td>  
		<xsl:value-of select="current()"/>  
	     </td>  
	     <td>  
		<xsl name="tabelle2">  
		<xsl select="//mbean2[1]/*">  
		<xsl:value-of select="current()"/>  
		</xsl>  
		</xsl>  
	     </td>  
	  </tr>  
	</xsl:for-each>  
      </xsl:template>  
		  
    <xsl:template name="tabelle2">  
	<xsl:for-each select="//mbean2[1]/*">  
	   <tr>  
	      <td>  
		 <xsl:value-of select="@name"/>  
	      </td>  
      	      <td>  
		 <xsl:value-of select="current()"/>  
	      </td>  
	   </tr>  
         </xsl:for-each>  
      </xsl:template>			  
   </xsl:stylesheet>

Ich habe versucht die zweite Tabelle unter dem ersten xsl:template zu öffnen. Es zeigt mir eine weitere Spalte an, genau dort wo ich diese eigentlich haben möchte. Das Problem ist nur, dass es mir trotzdem noch die Werte der ersten Tabelle übernimmt. Ausserdem kann ich das zweite xsl:template nicht löschen, weil es sonst nicht Wohlgeformt ist.

Mein Ziel ist es nun eine Tabelle mit drei Spalten zu erzeugen, wo links die Attributnamen stehen und in der mitte und rechts meine beiden Tabellen sind. Es soll zum vergleich dienen.

Ich wäre sehr froh wenn mir jemand helfen kann oder mir eine gute Internetseite empfehlen könnte.

Danke schon im Voraus.

Freundliche Grüsse

SHT16freak ;-)

  1. Nach groben Überfliegen denke ich, du suchst soetwas wie hier, nur nicht ganz so komplex.

    1. Vermutlich suchst du:
      <xsl:value-of select="/modul/mbean2/*[local-name()=name(current())]"/>

      Ausserdem kann ich das zweite xsl:template nicht löschen, weil es sonst nicht Wohlgeformt ist.

      Das kann nicht sein.

      1. Hallo zusammen

        Ich versuche jetzt  die beiden Tabellen zu vergleichen. Wenn diese nicht gleich sind sollen sie farblich hervorgehoben werden. Ist dies mit XPath ausdrücken möglich? Ich habe schon einiges versucht, leider ohne Erfolg. Auch mit <choose> und <when test="boolean(@name) != boolean(@name)"> habe ich es versucht. Geht nicht.

        Ich komm hier einfach nicht weiter :(

        1. Hallo,

          Ich versuche jetzt  die beiden Tabellen zu vergleichen. Wenn diese nicht gleich sind sollen sie farblich hervorgehoben werden.

          imho ist xsl die falsche Stelle für diesen Vergleich. Die XML wird ja an einer bestimmten Stelle erzeugt, dort ist der Vergleich sicher leichter zu lösen. Und dann gibts dort ein Attribut, das besagt "gleich" oder "ungleich" fürs XML und darauf kannst du mit einer bestimmten Farbgebung reagieren.

          Viele Grüße
          Siri

        2.   
          <xsl:value-of select="/modul/mbean2/*[local-name()=name(current())][@name=current()/attribute::name]"/>  
          <xsl:if test="/modul/mbean2/*[local-name()=name(current())][@name=current()/attribute::name]!=current()">  
            ungleich  
          </xsl:if>  
          </td>
          
          1. <xsl:value-of select="/modul/mbean2/[local-name()=name(current())][@name=current()/attribute::name]"/>
            <xsl:if test="/modul/mbean2/
            [local-name()=name(current())][@name=current()/attribute::name]!=current()">
              ungleich
            </xsl:if>
            </td>

              
            Vielen Dank! Funktioniert  
              
            Ich versuche jedoch nun statt "ungleich" die Zeile farbig hervorzuheben. Ich habe schon jegliche möglichkeiten versucht wie zb. "<xsl:attribute name="bgcolor">#EEEEFF</xsl:attribute>"  
              
            Auch mit Javascript hab ich es versucht. Ohne Erfolg. :(  
              
            Ich bekomm das einfach nicht hin. Hat jemand noch ein Tipp oder ein Link zur selbsthilfe?