/ / XSLT Ponechajte pridať premennú v slučke - xslt

XSLT Pridajte premennú do slučky - xslt

Hľadám nápad na to, ako môžem pridať premennú pre každú slučku.

<group>
<spare bitCnt="5"/>
<integer name="A" bitCnt="11"/>
<spare bitCnt="15"/>
<integer name="B" bitCnt="1"/>
</group>

Očakávaný výstup súboru hlavičky:

UINT16 A: 11;
UINT16 spare: 5;
UINT16 B: 1;
UINT16 spare 15;

Musím naďalej pridávať bitCnt premenných v "skupine" a ak premenná spadá na hranicu slov s 2 bajtami, musím vymieňať poradie prvkov.

Moja otázka je "ako môžem sledovaťbitCnt, ako som spustiť prvky v-pre každú slučku? " Bol by som niečo ako totalBitCnt v xslt a v for-each smyčke, stále pridávať totalBitCnt na určenie, či "totalBitCnt mod 16" je nula. Takže by sa zvyšoval ako 5, 18 (5 + 13), 23 (15 + 18), 24 (23 + 1), pretože beží na slučke. Každý všeobecný prístup je vysoko cenený.

Vďaka,

odpovede:

0 pre odpoveď č. 1

Nie som si istý, že vám narazím do konkrétneho kontextu, takže odpoviem všeobecne.

Akumulácia v slučke je iteračný prístup a XSLT (myslím, že používate 1.0) je v tejto záležitosti veľmi obmedzená. Myslím, že vašou najlepšou stávkou je nastaviť niečo rekurzívne.

Pomenované šablóny by mohli byť definované a vyvolané namiesto cyklu pre každý. Definovali ste ho pomocou parametrov, ako sú: zoznam prvkov, ktoré sa majú spracovať, a akumulátor.

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

Potom by ste ju mali vyvolať namiesto písania inline pre každú slučku:

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