2016-10-17 3 views
-1

Ich muss eine Gruppe von Werten durchlaufen und sie in eine zweispaltige Tabelle drucken.Dynamische HTML-Tabelle mit XSLT

Ich dachte Lösung nach

<table class="main"> 

    <xsl:for-each select="Attribute/Gruppe"> 
     <xsl:if test="current()/@ID=20064490"> 
      <xsl:variable name="open_row"><![CDATA[<tr><td style="width:50%;"> 
       <xsl:value-of select="current()/@name" /></td>]]></xsl:variable> 
      <xsl:variable name="closing_row"><![CDATA[<td style="width:50%;"> 
       <xsl:value-of select="current()/@name" /></td></tr>]]></xsl:variable> 

      <xsl:variable name="table"> 
       <xsl:for-each select="*"> 
        <xsl:choose> 
         <xsl:when test="(position() mod 2) = 1"> 
          <xsl:value-of select="$open_row" 
           disable-output-escaping="yes" /> 

         </xsl:when> 
         <xsl:otherwise> 

          <xsl:value-of select="$closing_row" 
           disable-output-escaping="yes" /> 

         </xsl:otherwise> 
        </xsl:choose> 
       </xsl:for-each> 
      </xsl:variable> 
      <xsl:value-of select="$table" 
       disable-output-escaping="yes" /> 
     </xsl:if> 
    </xsl:for-each> 
</table> 

ich den Code (XSLT1 sein muss) jetzt geändert ich position() bin mit einem Schluss um herauszufinden, ob <tr> oder eine Öffnung </tr> erforderlich ist.

Das gesamte Problem könnte zusammengefasst werden, dass Sie nicht einzelne Tags in XSLT schreiben können. Und das disable-output-escaping funktioniert nicht.

resultierende HTML sollte https://jsfiddle.net/dwetctm6/

für alle Knoten in der Gruppe sein. Die Reihenfolge der Knoten in der Tabelle spielt keine Rolle.

Des Weiteren folgende XML annehmen:

<bgroup> 
    <NODE1>text</NODE1> 
    <NODE2>text</NODE2> 
    <NODE n-1>text</NODE n-1> 
    <NODE n>text</NODE n> 
</bgroup> 
+0

Bitte schreiben Sie ein ** reproduzierbares ** Beispiel, einschließlich Eingabe, ein ausführbares Stylesheet, und das erwartete Ergebnis - siehe: [mcve] –

+0

Ich verstehe nicht, warum Sie alle meine Daten wollen. Ich möchte eine zweispaltige Tabelle. Ist es nicht klar, wenn Sie sich den Code anschauen? Was ist unklar? – Jan

+1

Ich will nicht ** all ** deine Daten. Ich möchte genug Code, der es mir ermöglicht, Ihr Problem durch nichts anderes zu reproduzieren, als es in meine Testumgebung zu kopieren/einzufügen. Und ich muss wissen, was das richtige Ergebnis ist, so dass ich einen Weg vorschlagen kann, es zu bekommen. –

Antwort

0

Knoten in eine zweispaltige Tabelle Aufteilung ist ziemlich trivial - vor allem, wenn der Auftrag (über-first oder Abwärts zuerst) keine Rolle spielt.

sich das folgende Sheet:

XSLT 1,0

<xsl:stylesheet version="1.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:template match="/bgroup"> 
    <table border="1"> 
     <xsl:for-each select="*[position() mod 2 = 1]"> 
      <tr> 
       <td><xsl:value-of select="."/></td> 
       <td><xsl:value-of select="following-sibling::*[1]"/></td> 
      </tr> 
     </xsl:for-each> 
    </table> 
</xsl:template> 

</xsl:stylesheet> 

Angewandt auf die folgenden wohlgeformte inpout:

XML

<bgroup> 
    <NODE1>A</NODE1> 
    <NODE2>B</NODE2> 
    <NODE3>C</NODE3> 
    <NODE4>D</NODE4> 
    <NODE5>E</NODE5> 
</bgroup> 

das Ergebnis wird sein:

<table border="1"> 
    <tr> 
     <td>A</td> 
     <td>B</td> 
    </tr> 
    <tr> 
     <td>C</td> 
     <td>D</td> 
    </tr> 
    <tr> 
     <td>E</td> 
     <td/> 
    </tr> 
</table> 

gemacht wie:

enter image description here

+0

Danke .. Ja .. Es ist trivial, wenn Sie dieses 'folgende-Geschwister :: * [1]' .. Ich bevorzuge Ihre Lösung mit einem for-each anstelle der Vorlagen .. – Jan

0

Nun müssen einige Bemerkungen in erster Linie gemacht werden:

  1. Sie müssen lernen, wie man XSLT funktioniert: Es ist eine Sprache für Templating, die, basierend auf XML, in einem geordneten W zusammengesetzt werden muss ay: Jeder geöffnete Knoten muss innerhalb desselben Bereichs geschlossen sein. michael.hor257k hat recht: Sie sollten keinen Knoten innerhalb eines Bereichs öffnen und ihn in einem anderen Bereich schließen.

  2. Es muss auch gesagt werden, dass Ihre Eingabe-XML nicht richtig strukturiert zu sein scheint: Es sollte eine Wiederholung von Knoten mit gleichen Namen und Typen sein. Wenn alle NODE-n Knoten funktional oder semantisch gleich sind, sollten sie denselben Namen haben, kein Problem: Sie können mehrere Knoten mit demselben Namen haben.

Und jetzt die Lösung: Ihr XML asuming ist, wie Sie es geschrieben haben, und da es kein Templat Definition basiert auf dem Namen Knoten mit unterschiedlichen Namen sein kann, habe ich alle Kind abgestimmt Knoten der bgroup Wurzelknoten. So kann die XSL so einfach wie diese:

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
    version="1.0"> 
    <xsl:output method="html" indent="yes"/> 

    <xsl:template match="/bgroup"> 
     <html> 
      <body> 
       <table> 
        <xsl:apply-templates select="*[position() mod 2 =1]"/> 
       </table> 
      </body> 
     </html> 
    </xsl:template> 

    <xsl:template match="*"> 
     <tr> 
      <td><xsl:value-of select="."/></td> 
      <td><xsl:value-of select="following-sibling::*[1]"/></td> 
     </tr> 
    </xsl:template> 

</xsl:stylesheet> 

Es ist wichtig, dass Sie erkennen, wie dank der geordnete Struktur der XSL-Sprache, können Sie sehen, wie die Ausgabe mit nur einem Blick wird von die XSL-Vorlage.