2016-07-13 14 views
0

I XML habenErstellen Tabelle mit Werten von Datensatz mit Hilfe von XSLT im Zusammenhang mit Kopf der Tabelle

 <People> 
     <Person> 
      <Index>0</Index> 
      <Attributes> 
      <Attribute> 
       <Name>First Name</Name> 
       <Value>Mike</Value> 
      </Attribute> 
      <Attribute> 
       <Name>Country</Name> 
       <Value>France</Value> 
      </Attribute> 
      <Attribute> 
       <Name>City</Name> 
       <Value>Paris</Value> 
      </Attribute> 
      </Attributes> 
     </Person> 
     <Person> 
      <Index>1</Index> 
      <Attributes> 
      <Attribute> 
       <Name>First Name</Name> 
       <Value>Peter</Value> 
      </Attribute> 
      <Attribute> 
       <Name>Country</Name> 
       <Value>Germany</Value> 
      </Attribute> 
      <Attribute> 
       <Name>Height</Name> 
       <Value>190</Value> 
      </Attribute> 
      </Attributes> 
     </Person> 
     <Person> 
      <Index>2</Index> 
      <Attributes> 
      <Attribute> 
       <Name>First Name</Name> 
       <Value>Justine</Value> 
      </Attribute> 
      <Attribute> 
       <Name>Hobby</Name> 
       <Value>Volleyball</Value> 
      </Attribute> 
      </Attributes> 
     </Person> 
     </People> 

sollte meine Ausgabe sieht wie folgt

First Name Country City Height Hobby 
Mike  France Paris  
Peter  Germany   190 
Justine        Volleyball 

Kopf der Tabelle unterschiedliche Werte hat aber wie Zellen beziehen von Datensatz zu Spalten?

Ich habe versucht, generate-id() zu verwenden und distinct-values ​​(), aber Werte sind nicht auf eine gute Spalte

Mein Code ist

<xsl:key name="KeyName" match="People/Person/Attributes/Attribute" use="Name" /> 
<xsl:template match="People"> 
<table> 
     <tr> 
      <xsl:for-each select="Person/Attributes/Attribute[generate-id() = generate-id(key('KeyName', Name)[1])]"> 
       <th> <xsl:value-of select="Name"/> </th> 
      </xsl:for-each> 
     </tr> 

    <xsl:for-each select="Person"> 
     <tr> 
      <xsl:for-each select="Attributes/Attribute">    
       <td> <xsl:value-of select="Value"/> </td> 
      </xsl:for-each> 
     </tr> 
    </xsl:for-each> 
</table> 
</xsl:template> 

vielleicht Mein falscher Code jemand vorschlagen zu gehen mit falschem Weg.

Mein Vorschlag ist mit generate-ID, um verschiedene Werte in der Kopfzeile zu haben und jeden zu (th) diese Liste merken.

Sortieren jeder Datensatz zu dieser Liste Vergleich Tag-Namen Header Wenn der Name zu vergleichen Tag existiert nicht in der Aufzeichnung der Person wir leeren Wert „“ einfügen

Jetzt Werte (Tag-Wert an nahe stehende mit Kopf) in Person Sortier Wir fügen als Zeile in Tabelle ein.

verwende ich XSLT 2.0, aber Version ist kein Problem

Irgendwelche Ideen?

Antwort

0

In XSLT 2.0 Sie können es auf diese Weise tun:

<xsl:stylesheet version="2.0" 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
<xsl:output method="xml" omit-xml-declaration="yes" version="1.0" encoding="utf-8" indent="yes"/> 

<xsl:key name="attr-by-name" match="Attribute" use="Name" /> 

<xsl:template match="/People"> 
    <xsl:variable name="attributes" select="distinct-values(Person/Attributes/Attribute/Name)" /> 
    <table border="1"> 
     <tr> 
      <xsl:for-each select="$attributes"> 
       <th> 
        <xsl:value-of select="."/> 
       </th> 
      </xsl:for-each> 
     </tr> 
     <xsl:for-each select="Person"> 
      <xsl:variable name="my-attributes" select="Attributes" /> 
      <tr> 
       <xsl:for-each select="$attributes">    
        <td> 
         <xsl:value-of select="key('attr-by-name', ., $my-attributes)/Value"/> 
        </td> 
       </xsl:for-each> 
      </tr> 
     </xsl:for-each> 
    </table> 
</xsl:template> 

</xsl:stylesheet> 

auf Ihre Eingabe Beispiel angewendet wird, die (gerendert) Ergebnis sein:

enter image description here

+0

Gibt es eine kostenlose Online XSLT 2.0 Transofrm-Website, wo dieser Code gute Ausgabe zurückgibt? ich viele Websites überprüft, aber ich habe Fehler, wenn ich den Code zum Beispiel überprüfen diesem Fehler ‚distinct-values ​​()‘ ist eine unbekannte XSLT-Funktion – ttplanete

+0

Versuchen http://xsltransform.net/ oder http: // xslttest.appspot.com/ (beide scheinen ATM zu sein). –

Verwandte Themen