2017-02-08 8 views
1

Зная, что вы не можете увеличить значение, если оно соответствует определенному условию, каков подход для этой логики.XSL Holding incremented Значение

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

Так что, если test3 был прав, значение будет равно 1 для значения тега. Это также верно, если верно только одно из трех тестов.

<tag>1</tag> 

Если бы все было так, то она будет идти

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

Если два были верны было бы только 2 метки и 1 и 2 были бы значения для них.

<tag>1</tag> 
<tag>2</tag> 
+0

Я не могу понять, в чем ваш вопрос. –

+0

Значение в теге. Как увеличить размер, основанный на предыдущих условиях if. –

+0

Все еще нет подсказки. Я предлагаю вам разместить небольшой пример ввода и ожидаемого вывода и объяснить требуемую логику словами, а не в каком-то загадочном псевдокоде. –

ответ

0

Очень сложно перепроектировать требование от неправильного кода (или псевдокода). В вашем коде обработка набора входных данных приводит к созданию нескольких «элементов тега» (неудобная терминология для «узлов элементов с локальным именем« тег »). Число из них, которые «уже существуют» в любой момент, непредсказуемо, поскольку оно полностью зависит от порядка исполнения, который не определен спецификацией. Но давайте представим, что это не xsl: for-each, а какой-то процедурный, последовательный для каждого, в котором элементы гарантированно обрабатываются по очереди. Если это семантику вы имели в виду для псевдокода, то вам нужно рекурсии:

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

И затем вызвать это с начальными параметрами //node() и 0.

В 2.0 вы можете сделать то же самое с рекурсивной функцией, которая является тем же самым принципом, но значительно менее подробным, а в 3.0 вы можете использовать xsl: iterate.