Я шукаю ідею про те, як можна додати змінну в кожному циклі.
<group>
<spare bitCnt="5"/>
<integer name="A" bitCnt="11"/>
<spare bitCnt="15"/>
<integer name="B" bitCnt="1"/>
</group>
Очікуваний вихідний файл заголовка:
UINT16 A: 11;
UINT16 spare: 5;
UINT16 B: 1;
UINT16 spare 15;
Мені потрібно продовжувати додавати bitCnt змінних у "групі", і якщо змінна падає на межу слова 2 байта, мені потрібно поміняти порядок елементів.
Моє питання - як я можу відстежуватиbitCnt, коли я запускаю елементи у кожному циклі? " Я хотів би щось на зразок totalBitCnt в xslt і в for-each loop, продовжуючи додавати totalBitCnt, щоб визначити, чи "totalBitCnt mod 16" дорівнює нулю. Таким чином, він буде збільшуватися як 5, 18 (5 + 13), 23 (15 + 18), 24 (23 + 1), коли він виконує цикл. Будь-який загальний підхід високо цінується.
Дякую,
Відповіді:
0 для відповіді № 1Я не впевнений, що я вам особливий контекст, тому я відповім у загальних рисах.
Накопичуючи в цикл for є ітеративний підхід і XSLT (я думаю, ви використовуєте 1.0) дуже обмежений в цьому питанні.Я думаю, що краще всього встановити щось рекурсивне.
Іменовані шаблони можуть бути визначені і викликані замість циклу for-each. Ви можете визначити його з такими параметрами, як: список елементів для обробки і акумулятор.
<xsl:template name="accumulator-template">
<xsl:param name="elements"/>
<xsl:param name="accumulator"/>
<!-- do stuff to the first element -->
<xsl:variable name="elements-left" select="$elements[???]"/> <!-- Exclude element that was processed -->
<xsl:choose>
<xsl:when test="$elements-left">
<!-- LOOPING -->
<xsl:call-template name="accumulator-template">
<xsl:with-param name="elements" select="$elements-left"/>
<xsl:with-param name="accumulator" select="$accumulator + number(@stuff)"/>
</xsl:call-template>
</xsl:when>
<xsl:otherwise>
<!-- END OF LOOP -->
</xsl:otherwise>
</xsl:choose>
</xsl:template>
Тоді ви запустите його замість того, щоб писати вбудований для кожного циклу:
<xsl:call-template name="accumulator-template">
<xsl:with-param name="elements" select="group"/>
<xsl:with-param name="elements" select="0"/> <!-- or any other starting value -->
</xsl:call-template>