根据XSLT中的条件递增值

时间:2016-02-02 12:15:42

标签: xml xslt xslt-2.0

我面临以下输入的增量值问题。我正在解释以下示例xml的问题。

如果<orange>元素不存在,请使用从10开始的计数器并将其递增10。

如果存在<orange>元素,那么我们需要显示<orange>元素的值。

输入:

<Fruits>
<Fruit>
    <apple>5</apple>
    <orange>4</orange>
</Fruit>
<Fruit>
    <banana>6</banana>
</Fruit>
<Fruit>
    <orange>4</orange>
</Fruit>
<Fruit>
    <apple>8</apple>
</Fruit>
<Fruit>
    <orange>5</orange>
</Fruit>
<Fruit>
    <orange>5</orange>
</Fruit>
<Fruit>
    <grapes>7</grapes>
</Fruit>
</Fruits>

预期产出:

<FruitsOutput>
    <Value>4</Value>
    <Value>10</Value> [Here Initial value is 10]
    <Value>4</Value>
    <Value>20</Value>[As orange value is not present .it is increment by 10 so it 20]
    <Value>5</Value>
    <Value>5</Value>
    <Value>30</Value>[As orange value is not present again it is incremented by 10 so it is 20]
</FruitsOutput>

我尝试使用position()。它会给出不符合我要求的元素位置。以下是xslt:

<xsl:for-each select="/Fruits/Fruit">           
                <Value>
                    <xsl:choose>
                        <xsl:when test="orange !=''">
                            <xsl:value-of select="orange"/>
                        </xsl:when>
                        <xsl:otherwise>
                            <xsl:value-of select="position() *10"/>
                        </xsl:otherwise>
                    </xsl:choose>
                </Value>                  
        </xsl:for-each>

我为上面的xslt输出的输出:

<FruitsOutput>
   <Value>4</Value>
   <Value>20</Value>
   <Value>4</Value>
   <Value>40</Value>
   <Value>5</Value>
   <Value>5</Value>
   <Value>70</Value>
</FruitsOutput>

2 个答案:

答案 0 :(得分:2)

<xsl:stylesheet version="2.0"
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform">

    <xsl:template match="/">
        <xsl:for-each select="Fruits/Fruit">
            <Value>
                <xsl:value-of select="if (not(orange)) 
                then ((count(preceding-sibling::Fruit[not(orange)]) + 1)*10)
                else orange"/>
            </Value>
        </xsl:for-each>
    </xsl:template>

</xsl:stylesheet>

答案 1 :(得分:1)

一种简单的方法是

<?xml version="1.0" encoding="UTF-8" ?>
<xsl:transform xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="2.0">


    <xsl:template match="@*|node()">
        <xsl:copy>
            <xsl:apply-templates select="@*|node()"/>
        </xsl:copy>
    </xsl:template>

    <xsl:template match="Fruit[orange]">
        <Value>
            <xsl:value-of select="orange"/>
        </Value>
    </xsl:template>

    <xsl:template match="Fruit[not(orange)]">
        <Value>
            <xsl:value-of select="10 * count(. | preceding-sibling::Fruit[not(orange)])"/>
        </Value>
    </xsl:template>
</xsl:transform>