我面临以下输入的增量值问题。我正在解释以下示例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>
答案 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>