我有一个包含博客文章的XML。每个帖子都包含一个date节点。
我想提取出发表文章的年份列表,并以一种花哨的格式打印出来。对于每一年,我想以一种非常相似的方式打印出活跃月份的列表。
外部部分对我来说工作得很好。由于我找不到使用原始XSLT-1.0实现它的方法,所以我使用EXSLT实现了它。我迭代posts,提取年份,将其放入一个新的year节点,并将其作为临时XML树存储在一个变量中。然后,我使用EXSLT从这个变量创建一个nodeset,遍历它并删除重复项。
但是,只要我为每年调用一个内部模板,即使我从第一个模板复制并粘贴变量构造代码并将其转储,它也不会生成任何输出。它只是拒绝再次迭代相同的节点集。
我在这里碰壁了,我肯定不能理解到底发生了什么。
这就是我设法简化的样式表::
<xsl:param name="myparam" select="''" />
<xsl:template match="/">
<ul>
<xsl:call-template name="outer" />
</ul>
</xsl:template>
<xsl:template name="outer">
<xsl:variable name="years_tree">
<xsl:for-each select="//post">
<xsl:sort select="date" />
<xsl:element name="year"><xsl:value-of select="substring(date, 1, 4)" /></xsl:element>
</xsl:for-each>
</xsl:variable>
<xsl:comment>
<xsl:copy-of select="$years_tree" />
</xsl:comment>
<xsl:for-each select="exsl:node-set($years_tree)/year[not(.=following::year)]">
<li>
<xsl:value-of select="." />
<xsl:if test="starts-with($myparam, string(.))">
<ul>
<xsl:call-template name="inner" />
</ul>
</xsl:if>
</li>
</xsl:for-each>
</xsl:template>
<xsl:template name="inner">
<xsl:variable name="years_tree">
<xsl:for-each select="//post">
<xsl:sort select="date" />
<xsl:element name="year"><xsl:value-of select="substring(date, 1, 4)" /></xsl:element>
</xsl:for-each>
</xsl:variable>
<xsl:copy-of select="$years_tree" />
</xsl:template>
</xsl:stylesheet>这是我的示例输入::
<?xml version="1.0" encoding="UTF-8"?>
<blog>
<post>
<date>2011-10-22T22:50:26</date>
</post>
<post>
<date>2011-10-02T17:25:14</date>
</post>
<post>
<date>2011-10-14T11:58:58</date>
</post>
<post>
<date>2011-11-21T11:58:58</date>
</post>
<post>
<date>2010-10-14T11:58:58</date>
</post>
<post>
<date>2011-09-14T11:58:58</date>
</post>
</blog>下面是我得到的输出::
<?xml version="1.0"?>
<ul>
<debug>
<year>2010</year>
<year>2011</year>
<year>2011</year>
<year>2011</year>
<year>2011</year>
<year>2011</year>
</debug>
<li>2010<ul><debug/></ul></li>
<li>2011<ul><debug/></ul></li>
</ul>发布于 2011-11-04 19:27:18
路径/选择当前上下文节点的文档节点,在本例中,您正在处理两个文档,主输入文档和您创建的临时文档。当您调用另一个模板时,context节点是临时文档中的一个year元素,因此您尝试使用//post尝试在临时文档中查找post元素,但该文档中没有任何元素。因此,您需要确保存储一个全局<xsl:variable name="main-doc" select="/"/>,然后当您在主输入文档中查找post元素时,您可以使用$main-doc//post。
https://stackoverflow.com/questions/8008193
复制相似问题