2016-06-20 11 views
-1

Eigentlich bin ich mit dem Problem konfrontiert, meine XML-Elemente mit der folgenden Bedingung zu analysieren; - Gesamtspalten sind 4 und wenn die gesamte Hspan der Elementknoten 4 wurde, dann behandelt es als eine Zeile. Zum Beispiel Element 1,2 als Zeile UND 3,4 als Zeile UND 5 sollte auch als Zeile behandelt werden.Prozess Geschwisterknoten und markiert als verarbeitete

<elements cols="4"> 
<element hspan="1" text= "text1"/> 
<element hspan="3" text= "text2"/> 
<element hspan="2" text= "text3"/> 
<element hspan="2" text= "text4"/> 
<element hspan="4" text= "text5"/> 
</elements> 

irgendwann Element kommt ohne hspan, in diesem Fall das Element als 1 betrachten werden soll, und weiter gehen.

Wenn ich Schleife in meinem XSLT mache für die nächsten Geschwisterknoten, wie kann ich das bereits verarbeitete Element ignorieren.

Erwartetes Ergebnis ist;

<row> 
    <cells> 
     <label text = text1> 
     <label text = text2> 
    </cells> 
</row> 
<row> 
<cells> 
     <label text = text3> 
     <label text = text4> 
</cells> 
</row> 
<row> 
<cells> 
     <label text = text5> 
</cells> 
</row> 

Hinweis: Ich verwende XSLT 2.0. Ich bin wirklich sehr dankbar für jede Hilfe. Grüßen, Jaji

+0

Bitte senden Sie das erwartete Ergebnis. - PS Warum befinden sich die Elemente 1,2 und 3 in derselben Zeile, wenn die Elemente 1 und 2 bereits eine Gesamtspanne von 4 haben? –

+0

Und jetzt ist es nicht klar, was passieren sollte, wenn Sie bereits 3 haben und die nächste ist 2. –

+0

@Michael - tatsächlich ist es in Hspan definiert, wie viele Spalten dieses Element belegt. Irgendwann ist es 1 für jedes Element, was bedeutet, dass jedes Element nur eine Spalte belegt. Ein haben mehr als 20 Elemente, deshalb möchte ich es in dynamischer (Schleife oder etwas anderes) Art und Weise tun. Ich schätze deine Hilfe sehr. –

Antwort

1

alle Angenommen, die Zählung der relevanten @hspan Attribute so immer genau in die Anzahl der erforderlichen cols passen, könnten Sie Gruppe die Elemente wie folgt:

<xsl:for-each-group select="element" group-starting-with="*[sum(preceding-sibling::element/@hspan) mod $cols = 0]"> 

dh Summe der vorhergehenden Elemente, und wo die Summe genau durch 4 geteilt wird, dann zeigt dies eine neue Reihe an.

diesen XSLT Versuchen

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="2.0"> 
    <xsl:output method="xml" indent="yes" /> 
    <xsl:template match="elements"> 
    <xsl:variable name="cols" select="@cols" /> 
    <xsl:for-each-group select="element" group-starting-with="*[sum(preceding-sibling::element/@hspan) mod $cols = 0]"> 
     <row> 
     <cells> 
      <xsl:apply-templates select="current-group()" /> 
     </cells> 
     </row> 
    </xsl:for-each-group> 
    </xsl:template> 

    <xsl:template match="element"> 
    <label text="{@text}" /> 
    </xsl:template> 
</xsl:stylesheet> 

Dies würde natürlich nicht, wenn die cols gesetzt wurde „4“ auf und die ersten beiden Elemente hatten hspan Attribute von 2 und 3, zum Beispiel.

EDIT: (! Danke Martin Honnen) Als Reaktion auf die Kommentare, wenn einige element Elemente keine hspan Attribute hatte, Ihre XSLT würde wie folgt aussehen

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="2.0" 
    xmlns:xs="http://www.w3.org/2001/XMLSchema" exclude-result-prefixes="xs"> 
    <xsl:output method="xml" indent="yes" /> 
    <xsl:template match="elements"> 
    <xsl:variable name="cols" select="@cols" /> 
    <xsl:for-each-group select="element" group-starting-with="*[sum(preceding-sibling::element/xs:decimal((@hspan,1)[1])) mod $cols = 0]"> 
     <row> 
     <cells> 
      <xsl:apply-templates select="current-group()" /> 
     </cells> 
     </row> 
    </xsl:for-each-group> 
    </xsl:template> 

    <xsl:template match="element"> 
    <label text="{@text}" /> 
    </xsl:template> 
</xsl:stylesheet> 
+0

Hervorragend und vielen Dank, Ihre Lösung hat mein Problem gelöst. Nur eins habe ich in meiner Frage vermisst, dass ein Zeitelement ohne "Hspan" kommt. In diesem Fall sollte das Element als hspan = "1" betrachtet werden. Würden Sie bitte auch eine Lösung vorschlagen, um diese zu lösen? Derzeit, wenn ich die XML-Elemente analysieren, die Elemente ohne Hspan enthalten, wie "" werden die gewünschten Ergebnisse nicht erhalten. –

+0

Frage bearbeitet –

+0

Ändern Sie den Code in '' –

Verwandte Themen