Я пытаюсь сделать преобразование XSLT, который генерирует код C, следующий XML должен быть преобразован:Как эмулировать C перечисление в XSLT с дополнительными значениями
<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>,
(для простоты я пропустить некоторые «нет запятой в последнем элементе» кода)
Этот пример не будет генерировать правильные значения для д и х
Я пытался получить его работу для переменной г и e, но до сих пор я не увенчался успехом.
Использование конструкции типа:
<xsl:when test="string-length(preceding-sibling::enumValue[1]/@datavalue)>0">
<xsl:value-of select="preceding-sibling::enumValue/@data + 1"/>
</xsl:when>
... работать только для первого после указанного значения (в данном случае г).
Кто может мне помочь? Я, вероятно, слишком много размышляю в процедурной форме ...
Я улучшил решение, которое использует ключи, и теперь это кажется действительно хорошим, см. Мой новый ответ. :) –
@Roalt Но если что-то отмечено «wiki сообщества», это мешает ему получать дальнейшие голоса - это нехорошо. –
@Roalt Но последний ответ также реализован. И это работает. Или что вы подразумеваете под ", но я использую ваш предыдущий ответ, потому что (1) он реализован, и он работает" –