Ich versuche, eine XSLT-Konvertierung, die C-Code generiert, die folgende XML umgewandelt werden soll zu machen:
<enum name="anenum">
<enumValue name="a"/>
<enumValue name="b"/>
<enumValue name="c" data="10"/>
<enumValue name="d" />
<enumValue name="e" />
</enum>
Es sollte in C-Code wie folgt umgewandelt werden:
enum anenum {
a = 0,
b = 1,
c = 10,
d = 11,
e = 12
}
oder alternativ (da der C-Präprozessor die Summierung übernimmt):
enum anenum {
a = 0,
b = 1,
c = 10,
d = c+1,
e = c+2
}
Der Kern meiner XSLT sieht so aus:
<xsl:for-each select="enumValue">
<xsl:value-of select="name"/>
<xsl:text> = </xsl:text>
<xsl:choose>
<xsl:when test="string-length(@data)>0">
<xsl:value-of select="@data"/>
</xsl:when>
<xsl:otherwise>
<xsl:value-of select="position()-1"/>
</xsl:otherwise>
</xsl:choose>
<xsl:text>,
(der Einfachheit halber lasse ich einen Teil des Codes "kein Komma am letzten Element" weg)
Dieses Beispiel erzeugt nicht die richtigen Werte für d y e
Ich habe versucht, es für die Variable d y e aber bis jetzt bin ich nicht erfolgreich.
Mit Konstruktionen wie:
<xsl:when test="string-length(preceding-sibling::enumValue[1]/@datavalue)>0">
<xsl:value-of select="preceding-sibling::enumValue/@data + 1"/>
</xsl:when>
...funktionieren nur für den ersten Wert nach dem angegebenen Wert (in diesem Fall d ).
Wer kann mir helfen? Wahrscheinlich denke ich zu sehr verfahrenstechnisch...