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 № 1Bardzo 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.