/ / XSL Holding збільшене значення - xml, xslt, відображення

XSL Holding збільшив значення - xml, xslt, mapping

Знаючи, що ви не можете збільшити значення, якщо воно відповідає певній умові, який тоді підхід до цієї логіки.

<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 для відповіді № 1

Дуже важко змінити вимогу до реконструкціївід неправильного коду (або псевдокоду). У вашому коді обробка вхідного набору призводить до створення ряду "елементів тегів" (незручна термінологія для "вузлів елементів з локальною назвою" тег ""). Кількість таких, які "вже існують" у будь-який момент, є непередбачуваною, оскільки вона повністю залежить від порядку виконання, який не визначається специфікацією. Але давайте уявимо, що це не було 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.