XSL最常见

时间:2013-12-23 14:52:02

标签: xml xslt

您好我是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篇文章,而其他人只写了一篇。我敢肯定这可能很容易,但正如我所说,我对这一切都是新手,我似乎无法管理它。在每个循环和各种各样的循环和计数之间,我的头在旋转。

欣赏它们,我正在大学学习,这样的问题有助于为我的期末考试找到某种形式或形式。干杯!

1 个答案:

答案 0 :(得分:2)

这里最有用的策略可能是

  1. 定义,为您提供给定作者姓名的所有故事
  2. 按照其键值
  3. 的匹配数的降序对作者列表进行排序
  4. 只列出此列表的第一个元素
  5. 键定义超出了所有模板:

    <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。