我无法弄清楚如何计算具有给定名称的节点的出现。
这是我的结构:
<xsl:variable name="pageType" select="/verticaldata/context/querystring/parameter[@name = 'type']"/>
<xsl:template match="/">
<xsl:if test="number(/verticaldata/contents/@totalcount) > 0">
<xsl:apply-templates select="verticaldata/contents/content"/>
</xsl:if>
</xsl:template>
<xsl:template match="content">
<xsl:variable name="itemType" select="contentdata/type">
<xsl:if test="$pageType = $itemType">
<xsl:call-template name="displayItem"/>
</xsl:if>
</xsl:template>
<xsl:template name="displayItem">
<!-- Here I want to show the item number in the id -->
<div class="item">
<xsl:attribute name="id">
<xsl:value-of select="count(preceding-sibling::content)"/>
</xsl:attribute>
<!-- Item renders here -->
</div>
</xsl:template>
我尝试过position()和count(前兄弟::内容),但它们都显示总计数而不是通过“类型”检查的项目数。 如何获取之前创建的“displayItem”节点的数量?
这可能吗?
// Daniel
答案 0 :(得分:1)
我认为,您需要做的是更改您的先前兄弟代码,以通过xpath表达式检查内容类型
<xsl:value-of select="count(preceding-sibling::content[contentdata/type = $pageType])"/>
事实上,您可以在 xsl:apply-templates
中使用相同的主体<xsl:apply-templates select="verticaldata/contents/content[contentdata/type = $pageType]"/>
这将允许您取消匹配模板中的 xsl:if ,这反过来意味着您可能无需为displayItem设置命名模板
<xsl:variable name="pageType" select="/verticaldata/context/querystring/parameter[@name = 'type']"/>
<xsl:template match="/">
<xsl:if test="number(/verticaldata/contents/@totalcount) > 0">
<xsl:apply-templates select="verticaldata/contents/content[contentdata/type = $pageType]"/>
</xsl:if>
</xsl:template>
<xsl:template match="content">
<div class="item">
<xsl:attribute name="id">
<xsl:value-of select="count(preceding-sibling::content[contentdata/type = $pageType])"/>
</xsl:attribute>
<!-- Item renders here -->
</div>
</xsl:template>
另外,您可以使用属性值模板在此设置div的ID
<div class="item" id="{count(preceding-sibling::content[contentdata/type = $pageType])}">
花括号表示要计算的表达式,而不是字面输出。