如何在XSLT中呈现有限数量的元素?

时间:2009-08-12 12:34:36

标签: xslt

我需要从XML源渲染指定数量的元素,其中不会删除元素“DueDate”。以下是xml:

的示例
<Items>
  <Item>
    <Title>Title 1</Title>
    <DueDate>01-02-2008</DueDate>
  </Item>
  <Item>
    <Title>Title 2</Title>
    <DueDate>01-02-2009</DueDate>
  </Item>
  <Item>
    <Title>Title 3</Title>
    <DueDate>01-02-2010</DueDate>
  </Item>
  <Item>
    <Title>Title 4</Title>
    <DueDate>01-02-2011</DueDate>
  </Item>
  <Item>
    <Title>Title 5</Title>
    <DueDate>01-02-2012</DueDate>
  </Item>
  <Item>
    <Title>Title 6</Title>
    <DueDate>01-02-2013</DueDate>
  </Item>
</Items>

要显示的元素数和当前日期作为参数传递给XSLT。 是否可以计算Xslt中for-each循环中渲染元素的数量?或者有更好的方法吗?

一个例子可能是限制设置为3个元素。在这个例子中,我希望看到以下结果:“Title 3”,“Title 4”和“Title 5”。

3 个答案:

答案 0 :(得分:4)

你可以这样做。将其设置为可以使用参数调用的模板:

<xsl:template match="/">
<xsl:variable name="count" select="3"/>

<xsl:for-each select="Items/Item">
    <xsl:if test="position() &lt; $count">
        <xsl:value-of select="Title"/> - <xsl:value-of select="DueDate"/>
    </xsl:if>
</xsl:for-each>

答案 1 :(得分:1)

尝试将其嵌套在标准xsl中 - 每个地方的n为3:

<xsl:if test="position() &lt; n">

但如果您还想查看日期,那么您将需要另外嵌套if和以yyyyMMdd格式创建日期,可以在数字上比较如下:

<xsl:variable name="secondDate" select="concat(substring(submissionDeadline, 1,4),substring(submissionDeadline, 6,2),substring(submissionDeadline, 9,2))"/>

<xsl:if test="$firstDate &gt; $secondDate">

答案 2 :(得分:0)

主要问题是您的输入XML不符合有用的'yyyy-mm-dd'格式。这使得排序/过滤这些项目成为后面 ass 的痛苦。

如果我理解正确,你需要

  • 首先截止日期
  • 在此之后对输出应用最大值

选择所有<Item>到最大截止日期的XPath将如下所示:

Item[
  substring-before(DueDate, '-') 
  &lt;= 
  substring-before($MaxDueDate, '-')

  and

  substring-before(substring-after(DueDate, '-'), '-')
  &lt;= 
  substring-before(substring-after($MaxDueDate, '-'), '-')

  and 

  substring-after(substring-after(DueDate, '-'), '-')
  &lt;= 
  substring-after(substring-after($MaxDueDate, '-'), '-')
][
  position() &lt;= $MaxCount
]

现在将它与琐碎的方式进行比较,如果你有'yyyy-mm-dd'日期:

Item[
  DueDate &lt;= $MaxDueDate
][
  position() &lt;= $MaxCount
]

所以,要复制这些元素,你会去:

<xsl:template match="Items">
  <xsl:copy>
    <xsl:copy-of select="
      { the expression I gave above }
    " />
  </xsl:copy>
</xsl:template>

对于'01-02-2012'4的参数值,我得到:

<Items>
  <Item>
    <Title>Title 1</Title>
    <DueDate>01-02-2008</DueDate>
  </Item>
  <Item>
    <Title>Title 2</Title>
    <DueDate>01-02-2009</DueDate>
  </Item>
  <Item>
    <Title>Title 3</Title>
    <DueDate>01-02-2010</DueDate>
  </Item>
  <Item>
    <Title>Title 4</Title>
    <DueDate>01-02-2011</DueDate>
  </Item>
</Items>