Я пытаюсь сделать XSLT-преобразование, которое генерирует код C, следующий XML должен быть преобразован:
<enum name="anenum">
<enumValue name="a"/>
<enumValue name="b"/>
<enumValue name="c" data="10"/>
<enumValue name="d" />
<enumValue name="e" />
</enum>
Он должен преобразоваться в некоторый код C следующим образом:
enum anenum {
a = 0,
b = 1,
c = 10,
d = 11,
e = 12
}
или альтернативно (поскольку препроцессор C будет обрабатывать суммирование):
enum anenum {
a = 0,
b = 1,
c = 10,
d = c+1,
e = c+2
}
Ядро моего XSLT выглядит так:
<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>,
(для простоты я пропускаю часть кода «без запятой в последнем элементе»)
В этом примере не будут сгенерированы правильные значения для d и e
Я пытался заставить его работать с переменной d и e , но пока что мне не удается.
Использование таких конструкций, как:
<xsl:when test="string-length(preceding-sibling::enumValue[1]/@datavalue)>0">
<xsl:value-of select="preceding-sibling::enumValue/@data + 1"/>
</xsl:when>
... работает только для первого после указанного значения (в данном случае d ).
Кто может мне помочь? Я, наверное, слишком много думаю в процедурном плане ...