/ / XSL Holding przyrostowa wartość - xml, xslt, mapowanie

XSL Holding incremented Value - xml, xslt, mapowanie

Wiedząc, że nie można zwiększyć wartości, jeśli spełnia ona określony warunek, jakie jest wówczas podejście do tej logiki.

<xsl:for-each select="(//node())">

if(node-name==test1)
<tag>value of (How many tag elements already exists)</tag>

if(node-name==test2)
<tag>value of (How many tag elements already exists)</tag>

if(node-name==test3)
<tag>value of (How many tag elements already exists)</tag>
</xsl:for-each>

Więc jeśli test3 byłby prawdziwy, wartość oznaczałaby 1 dla wartości znacznika. Jest to również prawdą, jeśli tylko jeden z trzech testów był prawdziwy.

<tag>1</tag>

Gdyby wszystko było prawdą, to by poszło

<tag>1</tag>
<tag>2</tag>
<tag>3</tag>

Gdyby dwa były prawdziwe, byłyby tylko 2 tagi, a 1 i 2 byłyby dla nich wartościami.

<tag>1</tag>
<tag>2</tag>

Odpowiedzi:

0 dla odpowiedzi № 1

Bardzo trudno jest odtworzyć wymaganiez niepoprawnego kodu (lub pseudokodu). W twoim kodzie przetwarzanie zestawu wejściowego powoduje utworzenie szeregu „elementów znaczników” (niewygodna terminologia dla „węzłów elementów o nazwie lokalnej„ znacznik ””). Liczba tych, które „już istnieją” w dowolnym momencie, jest nieprzewidywalna, ponieważ zależy wyłącznie od kolejności wykonania, która nie jest określona przez specyfikację. Wyobraźmy sobie jednak, że to nie był xsl: for-each, ale jakieś procedury, sekwencyjne dla każdego, w których gwarantowano, że elementy będą przetwarzane jeden po drugim w kolejności. Jeśli to jest semantyka, którą miałeś na myśli dla swojego pseudokodu, potrzebujesz rekurencji:

<xsl:template name="process-items">
<xsl:param name="items"/>
<xsl:param name="tags-created"/>
<xsl:variable name="head" select="$items[1]"/>
<xsl:variable name="tail" select="$items[position() > 1]"/>
<xsl:if test="$head">
<xsl:choose>
<xsl:when test="self::tag1 or self::tag2">
<tag><xsl:value-of select="$tags-created"/></tag>
<xsl:call-template name="process-items">
<xsl:with-param name="items" select="$tail"/>
<xsl:with-param name="tags-created select="$tags-created+1"/>
</xsl:call-template>
</xsl:when>
<xsl:otherwise>
<xsl:call-template name="process-items">
<xsl:with-param name="items" select="$tail"/>
<xsl:with-param name="tags-created select="$tags-created"/>
</xsl:call-template>
</xsl:otherwise>
</xsl:choose>
</xsl:if>
</xsl:template>

A następnie wywołaj to z parametrami początkowymi //node() i 0.

W 2.0 możesz zrobić to samo z funkcją rekurencyjną, która jest tą samą zasadą, ale znacznie mniej gadatliwą, aw 3.0 możesz użyć xsl: iterate.