您好我是XSL的新手,我正在尝试创建一个XSL样式表,根据他们编写的文章数量打印最常见作者的名称,如XML文档中所指定。
XML
<?xml version="1.0"?>
<?xml-stylesheet type="text/xsl" href="busiestAuthor.xsl"?>
<latestIssue>
<issue number="357" />
<date>
<day> 4 </day>
<month> 1 </month>
<year> 2013 </year>
</date>
<stories>
<story>
<title> The earth is flat </title>
<author> Tom Friedman </author>
<url> http://www.HotStuff.ie/stories/story133456.xml </url>
</story>
<story>
<title> Films to watch out for in 2013 </title>
<author> Brated Film Critic </author>
<url> http://www.HotStuff.ie/stories/story133457.xml </url>
</story>
<story>
<title> The state of the economy </title>
<author> Tom Friedman </author>
<url> http://www.HotStuff.ie/stories/story133458.xml </url>
</story>
<story>
<title> Will an asteroid strike earth this year? </title>
<author> Stargazer </author>
<url> http://www.HotStuff.ie/stories/story133459.xml </url>
</story>
</stories>
</latestIssue>
所以我想要busiestAuthor.xsl打印的结果只是 Tom Friedman ,因为他已经写了2篇文章,而其他人只写了一篇。我敢肯定这可能很容易,但正如我所说,我对这一切都是新手,我似乎无法管理它。在每个循环和各种各样的循环和计数之间,我的头在旋转。
欣赏它们,我正在大学学习,这样的问题有助于为我的期末考试找到某种形式或形式。干杯!
答案 0 :(得分:2)
这里最有用的策略可能是
键定义超出了所有模板:
<xsl:key name="storiesByAuthor" match="story" use="author" />
然后按故事数排序并采用第一个元素,您需要在XSLT 1.0中执行类似的操作:
<xsl:for-each select="/latestIssue/stories/story/author">
<xsl:sort select="count(key('storiesByAuthor', .))"
data-type="number" order="descending" />
<xsl:if test="position() = 1">
<!-- in here, . is one of the author elements for the author with the
most stories -->
</xsl:if>
</xsl:for-each>
这个for-each产生重复的事实在这里不是问题,因为你只关心第一个&#34;迭代&#34;。如果您有多个具有相同最大故事数的作者,您将获得原始文档中首先提到的任何一个(因为xsl:sort
是&#34;稳定&#34;,即具有按文档顺序返回相同的排序键值。)
对于XSLT 2.0,您可以使用xsl:perform-sort
而不是for-each
,但是如果您使用<?xml-stylesheet?>
,我认为您正在浏览器中进行转换,并且大多数(所有?)浏览器仅支持1.0。