使用XSLT在X项之后输出新的ul列表

时间:2013-11-25 08:02:04

标签: html xml xslt umbraco

我在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">&nbsp; </div>
    </div>  
</xsl:when>

但我不确定如何做到这一点。

我应该使用position()吗?

使用此

调用模板
{{1}}

2 个答案:

答案 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) &gt; 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() &gt; 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() &lt;= 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() &gt; 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>