我需要从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”。
答案 0 :(得分:4)
你可以这样做。将其设置为可以使用参数调用的模板:
<xsl:template match="/">
<xsl:variable name="count" select="3"/>
<xsl:for-each select="Items/Item">
<xsl:if test="position() < $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() < 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 > $secondDate">
答案 2 :(得分:0)
主要问题是您的输入XML不符合有用的'yyyy-mm-dd'格式。这使得排序/过滤这些项目成为后面 ass 的痛苦。
如果我理解正确,你需要
选择所有<Item>
到最大截止日期的XPath将如下所示:
Item[
substring-before(DueDate, '-')
<=
substring-before($MaxDueDate, '-')
and
substring-before(substring-after(DueDate, '-'), '-')
<=
substring-before(substring-after($MaxDueDate, '-'), '-')
and
substring-after(substring-after(DueDate, '-'), '-')
<=
substring-after(substring-after($MaxDueDate, '-'), '-')
][
position() <= $MaxCount
]
现在将它与琐碎的方式进行比较,如果你有'yyyy-mm-dd'日期:
Item[
DueDate <= $MaxDueDate
][
position() <= $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>