/ / XSLT Продовжуйте додавати змінну в циклі - xslt

XSLT Додайте змінну в циклі - xslt

Я шукаю ідею про те, як можна додати змінну в кожному циклі.

<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>