2016-08-24 6 views
0

Hier ist ein Auszug aus einem XSL-Dokument (innerhalb einer Vorlage technisch):Wie zu transformieren XML-Attribute in eine HTML-Tabelle

<table> 
    <tr> 
    <th>INSTANCE</th> 
    <th>SWVER</th> 
    <th>SYSTEMID</th> 
    <th>SYSTIME</th> 
    <th>SYSMEM</th> 
    <th>CUTMEM</th> 
    <th>FILEMEM</th> 
    <th>CALCONFIG</th> 
    </tr> 
    <tr> 
    <td><xsl:value-of select='@INSTANCE'/></td> 
    <td><xsl:value-of select='@SWVER'/></td> 
    <td><xsl:value-of select='@SYSTEMID'/></td> 
    <td><xsl:value-of select='@SYSTIME'/></td> 
    <td><xsl:value-of select='@SYSMEM'/></td> 
    <td><xsl:value-of select='@CUTMEM'/></td> 
    <td><xsl:value-of select='@FILEMEM'/></td> 
    <td><xsl:value-of select="@CALCONFIG"/></td> 
    </tr> 
</table> 

Gibt es eine Möglichkeit, dass ich sowohl die Redundanz des Schreibens aus den Attributen vermeiden kann als Tabellenüberschriften und als Attributauswahl? Ich kann keine externen Quellen verwenden.

Ich dachte, ich könnte eine xsl-Variable definieren, die eine grundlegende Struktur enthält, wie folgt und die Tabelle von dort generieren.

<list> 
    <item>INSTANCE</item> 
    ... 
    <item>CALCONFIG</item> 
</list> 

Die XML-Daten sind nur eine Sammlung von Tags mit demselben Wert, die mindestens die oben aufgeführten Attribute enthalten. Jeder Tag sieht ungefähr so ​​aus:

<THING INSTANCE="boop" SWVER="foo" SYSTEMID="123" 
... 
CALCONFIG="cal.cfg" SOMETHINGELSE="bar" 
/> 
+0

Sie müssen die Eingabe-XML und das vollständige Stylesheet anzeigen. –

+0

Fertig. Hast du irgendwelche Ideen? – Bryant

+0

IMHO, die Alternative wird am Ende ausführlicher und weniger lesbar als das, was Sie haben - exp. wenn Sie XSLT 1.0 verwenden. –

Antwort

2

Um den Punkt, den ich in einem Kommentar zu Ihrer Frage gestellt, betrachten Sie das folgende Beispiel zu verdeutlichen:

XML

<root> 
    <item color="red" name="alpha" size="small" garbage="123" id="1"/> 
    <item color="green" name="bravo" size="medium" garbage="456" id="2"/> 
    <item color="blue" name="charlie" size="large" garbage="789" id="3"/> 
</root> 

XSLT 1,0

<xsl:stylesheet version="1.0" 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
xmlns:my="http://www.example.com/my" 
exclude-result-prefixes="my"> 
<xsl:output method="html" encoding="utf-8"/> 
<xsl:strip-space elements="*"/> 

<my:columns> 
    <col>id</col> 
    <col>name</col> 
    <col>size</col> 
    <col>color</col> 
</my:columns> 
<xsl:variable name="columns" select="document('')/xsl:stylesheet/my:columns" /> 

<xsl:template match="/root"> 
    <table border="1"> 
     <tr> 
      <xsl:for-each select="$columns/col"> 
       <th> 
        <xsl:value-of select="." /> 
       </th> 
      </xsl:for-each> 
     </tr> 
     <xsl:for-each select="item"> 
      <xsl:variable name="attributes" select="@*" /> 
      <tr> 
       <xsl:for-each select="$columns/col"> 
        <td> 
         <xsl:value-of select="$attributes[name()=current()]" /> 
        </td> 
       </xsl:for-each> 
      </tr> 
     </xsl:for-each> 
    </table> 
</xsl:template> 

</xsl:stylesheet> 

Ergebnis (gerendert)

enter image description here

+0

Danke Michael, das ist, was ich gesucht habe, obwohl es weniger lesbar ist, wird es mir wahrscheinlich eine Zeit sparen. – Bryant

+0

Eine Frage, was macht diese Linie? 'exclude-result-prefixes =" my "' Ich bin auch neugierig, warum der Namespace das funktioniert. Haben Sie etwas, auf das Sie mich hinweisen könnten, oder erklären Sie es einfach hier? – Bryant

+2

Es verhindert, dass die Namespace-Deklaration 'xmlns: my =" http://www.example.com/my "' in der Ausgabe erscheint. Jeder moderne Browser würde es sowieso ignorieren, also ist es nur eine Frage der guten Praxis. - Der Namespace ist erforderlich, weil ohne ihn 'columns' als [literal result element] (https://www.w3.org/TR/xslt/#literal-result-element) interpretiert würde und einen Fehler verursacht, da ein literales Ergebniselement nicht außerhalb einer Vorlage liegen kann. –

-1

Bryant, müssen Sie mit zwei Dateien (XML und XSL) arbeiten:

Zuerst müssen Sie eine Vorlage angeben (example.xsl):

<?xml version="1.0" encoding="UTF-8"?> 

<xsl:stylesheet version="1.0" 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 

<xsl:template match="/"> 
    <html> 
    <body> 
    <h2>My Collection</h2> 
    <table border="1"> 
    <tr bgcolor="#9acd32"> 
     <th>instance</th> 
     <th>swver</th> 
     <th>systemid</th> 
     <th>systime</th> 
     <th>sysmem</th> 
     <th>cutmem</th> 
     <th>filemem</th> 
     <th>calconfig</th> 
    </tr> 
    <xsl:for-each select="catalog/cd"> 
    <tr> 
     <td><xsl:value-of select="instance"/></td> 
     <td><xsl:value-of select="swver"/></td> 
     <td><xsl:value-of select="systemid"/></td> 
     <td><xsl:value-of select="systime"/></td> 
     <td><xsl:value-of select="sysmem"/></td> 
     <td><xsl:value-of select="cutmem"/></td> 
     <td><xsl:value-of select="filemem"/></td> 
     <td><xsl:value-of select="calconfig"/></td> 
    </tr> 
    </xsl:for-each> 
    </table> 
    </body> 
    </html> 
</xsl:template> 

</xsl:stylesheet> 

Und dann müssen Sie Ihre XML-Datei (example.xml) definieren, basierend auf der Vorlage (example.xsl):

<?xml version="1.0" encoding="UTF-8"?> 
<?xml-stylesheet type="text/xsl" href="example.xsl"?> 
<catalog> 
    <cd> 
    <instance>instance1</instance> 
    <swver>swver1</swver> 
    <systemid>systemid1</systemid> 
    <sysmem>sysmem1</sysmem> 
    <systime>systime1</systime> 
    <cutmem>cutmem1</cutmem> 
    <filemem>filemem1</filemem> 
    <calconfig>calconfig1</calconfig> 

    </cd> 
    <cd> 
    <instance>instance2</instance> 
    <swver>swver2</swver> 
    <systemid>systemid2</systemid> 
    <sysmem>sysmem2</sysmem> 
    <systime>systime2</systime> 
    <cutmem>cutmem2</cutmem> 
    <filemem>filemem2</filemem> 
    <calconfig>calconfig2</calconfig> 

    </cd> 
. 
. 
</catalog> 

Ergebnis:

enter image description here

Referenz: http://www.w3schools.com/xsl/xsl_transformation.asp

hoffe, das hilft!

+1

Sie haben die Frage nicht beantwortet, haben nur zurück gegeben, was der OP bereits gesagt hat, dass er fertig ist. Bitte lesen Sie die Frage sorgfältig erneut. –

Verwandte Themen