我的xml有白天和晚上的时间,所以我需要使用mod 2=1来获得每个设定日的奇数dailyforecast
。但当我这样做的时候,它给了我整个10天的预测,我只想得到5天。要设置5天,我知道我必须使用position < 5
,但我不知道如何使用mod 2 = 1
来暗示这一点。任何帮助都可以,希望这足够详细。
<forecast>
<dailyforecast>
<hightemp>
</hightemp>
</dailyforecast>
<lowtemp>
</lowtemp>
<dailyforecast>
<hightemp>
</hightemp>
</dailyforecast>
<dailyforecast>
<lowtemp>
</lowtemp>
</dailyforecast>
<dailyforecast>
<hightemp>
</hightemp>
</dailyforecast>
<dailyforecast>
<lowtemp>
</lowtemp>
</dailyforecast>
<dailyforecast>
<hightemp>
</hightemp>
</dailyforecast>
<dailyforecast>
<lowtemp>
</lowtemp>
</dailyforecast>
<dailyforecast>
<hightemp>
</hightemp>
</dailyforecast>
<dailyforecast>
<lowtemp>
</lowtemp>
</dailyforecast>
<dailyforecast>
<hightemp>
</hightemp>
</dailyforecast>
</forecast>
此XPATH应该工作:
/forecast/dailyforecast[position() < 10 and position() mod 2 =1]
实现这一点的一种方法是:
<xsl:template match="forecast">
<xsl:apply-templates mode="top" select="dailyforecast[position() mod 2 = 1]">
<xsl:with-param name="count" select="5" />
</xsl:apply-templates>
</xsl:template>
<!-- generic TOP template -->
<xsl:template match="*" mode="top">
<xsl:param name="count" select="1" />
<xsl:if test="position() <= $count">
<xsl:apply-templates select="." />
</xsl:if>
</xsl:template>
<xsl:template match="dailyforecast">
<!-- format current node (day) and following-sibling::dailyforecast[1] (night) -->
</xsl:template>
这是因为position()
指的是选定节点集中的位置。因此,如果您只在模板1中选择奇数节点,您将在模板2中获得一个新的位置计数器。
当然,您可以将通用的"top"功能折叠到dailyforecast
模板中,但它将不再可重用。
<xsl:template match="dailyforecast">
<xsl:if test="positon() <= 5">
<!-- format current node (day) and following-sibling::dailyforecast[1] (night) -->
</xsl:if>
</xsl:template>