2009-02-28 1 views
1

Ich habe so xml:XML-Tabelle, wie Position zu bekommen() von Context-Knoten mit dem angegebenen Vorfahren (n)

<A1> 
    <B1> 
    <C1> 
    <C2> 
    <C3> 
    </B1> 
    <B2> 
    <C4> 
    <C5> 
    <C6> 
    </B2> 
</A1> 
<A2> 
    <B3> 
    <C7> 
    <C8> 
    <C9> 
    </B3> 
    <B4> 
    <C10> 
    <C11> 
    <C12> 
    </B4> 
</A2> 

Ich brauche es mit verschachtelten Zeilen Tabelle zu transformieren:

<table border="yes"> 
<tr> 
    <td>A1</td> 
    <td>B1</td> 
    <td>C1</td> 
</tr> 
<tr> 
    <td></td> 
    <td></td> 
    <td>C2</td> 
</tr> 
<tr> 
<td></td> 
<td></td> 
<td>C3</td> 
</tr> 
<tr> 
<td></td> 
<td>B2</td> 
<td>C3</td> 
</tr> 
<tr> 
<td></td> 
<td></td> 
<td>C4</td> 
</tr> 

A und B erscheinen nur, wenn sie neu sind (nicht in jeder Zeile wiederholen);

Ich versuche Position zu verwenden()

<xsl:template match="c"> 
<tr> 
    <td> 
    <xsl:if test="IT IS THE FIRST C IN A"> 
    <xsl:value-of select="ancestor::A"/> 
    </xsl:if> 
    </td> 
    <td> 
    <xsl:if test="position(1)"> 
    <xsl:value-of select="parent"/> 
    </xsl:if> 
    </td> 
    <td> 
    <xsl:value-of select="."/> 
    </td> 
</tr> 
</xsl:template> 

Es scheint, dass wir Position() für Ahnen emulieren soll. Gibt es eine allgemeine Lösung für eine beliebige Anzahl von geschachtelten Zeilen?

+0

Könnten Sie bitte besser erklären? Warum sollten Knoten, die von B2 und C3 ausgehen, nicht in der Ausgabe erscheinen? Die Regel zur Erzeugung der Ausgabe ist nicht klar. –

+0

die Antwort unten passt, danke. Die Idee war, dass alle Knoten A und B nur einmal in der Tabelle erscheinen. sich nicht wiederholend. – rudnev

Antwort

2

Sie müssen vielleicht so etwas wie die folgenden (wenn ich Ihre Frage richtig verstanden):

<xsl:template match="C"> 
<tr> 
    <td> 
    <xsl:if test="generate-id(ancestor::A/descendant::C[1]) = generate-id(.)"> 
    <xsl:value-of select="ancestor::A"/> 
    </xsl:if> 
    </td> 
    <td> 
    <xsl:if test="not(previous-sibling::C)"> 
    <xsl:value-of select=".."/> 
    </xsl:if> 
    </td> 
    <td> 
    <xsl:value-of select="."/> 
    </td> 
</tr> 
</xsl:template> 

<xsl:template match="/"> 
    <xsl:apply-templates select="descendant::C"/> 
</xsl:template> 

Edit: Sie auch

not(previous-sibling::C) and not(../previous-sibling::B) 

als erster Test (anstelle der Verwendung generate-id()) verwenden .

+0

Vielen Dank, das funktioniert genau :) – rudnev

Verwandte Themen