2017-02-08 3 views
1

Wissen, dass Sie einen Wert nicht erhöhen können, wenn er eine bestimmte Bedingung erfüllt, was dann der Ansatz für diese Logik ist.XSL Holding inkrementierter Wert

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

Wenn also test3 nur wahr war, wäre der Wert 1 für den Variablenwert. Dies gilt auch, wenn nur einer der drei Tests zutrifft.

<tag>1</tag> 

Wenn alles wahr wäre, dann wäre es

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

gehen Wenn zwei nur wahr, es gab 2-Tags wäre und die 1 und 2 würde für sie die Werte sein.

+0

Ich kann nicht herausfinden, was Ihre Frage ist. –

+0

Der Wert im Tag. Wie erhöhe ich das basierend auf vorherigen if-Bedingungen. –

+0

Noch keine Ahnung. Ich schlage vor, Sie ein kleines Beispiel für die Eingabe und die erwartete Ausgabe, und erklären Sie die erforderliche Logik in Worten, nicht in einem kryptischen Pseudocode. –

Antwort

0

Es ist sehr schwierig, eine Anforderung von falschem Code (oder Pseudo-Code) zurückzuentwickeln. In Ihrem Code führt die Verarbeitung eines Eingabesatzes zur Erzeugung einer Anzahl von "Tag-Elementen" (umständliche Terminologie für "Elementknoten mit lokalem Namen 'tag'"). Die Anzahl von diesen, die an irgendeinem Punkt "bereits existieren", ist nicht vorhersagbar, da sie vollständig von der Ausführungsreihenfolge abhängt, die nicht durch die Spezifikation definiert ist. Aber stellen wir uns vor, dass dies kein xsl: for-each war, sondern irgendeine Art von prozeduralem, sequenziellem for-each, in dem die Items garantiert einzeln hintereinander verarbeitet wurden. Wenn das die Semantik ist für Ihre Pseudo-Code im Sinn hatte, dann müssen Sie Rekursion:

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

Und dann nennen dies mit Anfangsparameter //node() und 0.

In 2.0 können Sie das Gleiche mit einer rekursiven Funktion tun, die das gleiche Prinzip aber viel weniger ausführlich ist, und in 3.0 können Sie xsl: iterate verwenden.