我在XSLT中有一个打印<ul>
列表的模板。就像现在一样,它会打印所有列表项。
<ul class="dotArrowList">
<li>item 1</li>
<li>item 2</li>
<li>item 3</li>
<li>item 4</li>
</ul>
如果列表中的<li>
多于<ul class="dotArrowList">
<li>item 1</li>
<li>item 2</li>
</ul>
<ul class="dotArrowList">
<li>item 3</li>
<li>item 4</li>
</ul>
,我需要再次输出该列表 - 用于浮点数。
<!-- Dot Arrow List -->
<xsl:template name="dotArrowList">
<xsl:param name="nodes" />
<xsl:if test="count($nodes/descendant::nodeId) > 0">
<ul class="dotArrowList">
<xsl:for-each select="$nodes/descendant::nodeId">
<xsl:if test=". != ''">
<xsl:variable name="node" select="umbraco.library:GetXmlNodeById(.)" />
<xsl:if test="$node/@id != ''">
<li>
<xsl:if test="position() = last()"><xsl:attribute name="class">last</xsl:attribute></xsl:if>
<a href="{umbraco.library:NiceUrl($node/@id)}">
<xsl:choose>
<xsl:when test="$node/displayName != ''"><xsl:value-of select="$node/displayName"/></xsl:when>
<xsl:otherwise><xsl:value-of select="$node/@nodeName" /></xsl:otherwise>
</xsl:choose>
</a>
</li>
</xsl:if>
</xsl:if>
</xsl:for-each>
</ul>
</xsl:if>
</xsl:template>
我的模板是:
<xsl:when test="name() = 'TimeTableBlock'">
<div class="layer1">
<xsl:call-template name="dotArrowList">
<xsl:with-param name="nodes" select="current()/box1Links1" />
</xsl:call-template>
<xsl:call-template name="dotArrowList">
<xsl:with-param name="nodes" select="current()/box1Links2" />
</xsl:call-template>
<xsl:call-template name="button">
<xsl:with-param name="text" select="current()/box1LinkText" />
<xsl:with-param name="link" select="'#'" />
</xsl:call-template>
<div class="lfb"> </div>
</div>
</xsl:when>
但我不确定如何做到这一点。
我应该使用position()吗?
使用此
调用模板{{1}}
答案 0 :(得分:1)
以下样式表提供了使用递归的解决方案。
递归调用的模板决定<li>
元素列表是否大于2个元素(处理前两个项目并使用列表的其余部分调用模板)或不是(创建final {{ 1}}中包含1或2个项目。)
<ul>
此输入XML
<?xml version="1.0" encoding="utf-8"?>
<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" indent="yes"/>
<xsl:template match="/">
<xsl:apply-templates/>
</xsl:template>
<xsl:template match="ul">
<xsl:call-template name="make-list">
<xsl:with-param name="list-items-left" select="li"/>
</xsl:call-template>
</xsl:template>
<xsl:template name="make-list">
<xsl:param name="list-items-left"/>
<xsl:choose>
<xsl:when test="count($list-items-left) > 2">
<xsl:element name="ul">
<xsl:attribute name="class">
<xsl:text>dotArrowList</xsl:text>
</xsl:attribute>
<xsl:element name="li">
<xsl:value-of select="$list-items-left[1]"/>
</xsl:element>
<xsl:element name="li">
<xsl:value-of select="$list-items-left[2]"/>
</xsl:element>
</xsl:element>
<xsl:call-template name="make-list">
<xsl:with-param name="list-items-left" select="$list-items-left[position() > 2]"/>
</xsl:call-template>
</xsl:when>
<xsl:otherwise>
<xsl:element name="ul">
<xsl:attribute name="class">
<xsl:text>dotArrowList</xsl:text>
</xsl:attribute>
<xsl:for-each select="$list-items-left">
<xsl:element name="li">
<xsl:value-of select="."/>
</xsl:element>
</xsl:for-each>
</xsl:element>
</xsl:otherwise>
</xsl:choose>
</xsl:template>
</xsl:stylesheet>
给你
<?xml version="1.0" encoding="utf-8"?>
<ul class="dotArrowList">
<li>item 1</li>
<li>item 2</li>
<li>item 3</li>
<li>item 4</li>
<li>item 5</li>
<li>item 6</li>
<li>item 7</li>
</ul>
答案 1 :(得分:0)
使用递归:
<xsl:template name="dotArrowList">
<xsl:param name="nodes" />
<xsl:if test="count($nodes) > 0">
<ul class="dotArrowList">
<xsl:for-each select="$nodes[position() <= 2]">
<xsl:if test=". != ''">
<xsl:variable name="node" select="umbraco.library:GetXmlNodeById(.)" />
<xsl:if test="$node/@id != ''">
<li>
<xsl:if test="position() = last()"><xsl:attribute name="class">last</xsl:attribute></xsl:if>
<a href="{umbraco.library:NiceUrl($node/@id)}">
<xsl:choose>
<xsl:when test="$node/displayName != ''"><xsl:value-of select="$node/displayName"/></xsl:when>
<xsl:otherwise><xsl:value-of select="$node/@nodeName" /></xsl:otherwise>
</xsl:choose>
</a>
</li>
</xsl:if>
</xsl:if>
</xsl:for-each>
</ul>
<xsl:call-template name="dotArrowList">
<xsl:with-param name="nodes" select="$nodes[position() > 2]" />
</xsl:call-template>
</xsl:if>
</xsl:template>
使用此调用代码:
<xsl:call-template name="dotArrowList">
<xsl:with-param name="nodes" select="current()/box1Links1/descendant::nodeId" />
</xsl:call-template>