使用XSLT为幻灯片显示创建组

时间:2017-07-21 18:57:48

标签: xml xslt grouping xslt-2.0

这似乎很容易,但我无法在任何地方找到一个例子。

我有一个项目列表,假设该列表有34个项目。

LinkedHashMap

我希望按日期对项目进行排序,然后创建十个组,然后将它们包装在滑块标记中 同时将幻灯片中的每个项目处理为一个列表。给我三组10件物品和第4张4件物品。给出以下输出:

<item>
    <title></title>
    <url></url>
    <date></date>
</item>
<item>...</item>
<item>...</item>
<item>...</item> etc.

我有可行的代码,但会发生的是它改变了排序顺序,我不知道为什么。如果我在排序后输出列表,则列表会正确排序,但是一旦创建了组,每个组中的项目就不会保留其位置。 (假设$ group-size = 10)

 <slide>
     <ul>    
        <li item 1>Title | Date | Url </li item 1>
        <li item 2>Title | Date | Url </li item 1>
        <li item 3>Title | Date | Url </li item 1>
        <li items 4-10>... etc..
     </ul>    
 </slide>

任何人都知道更好的方法吗?也许使用“分组”或不同的结构?

提前致谢!

1 个答案:

答案 0 :(得分:1)

使用例如

对项目进行排序
<xsl:variable name="sorted-items" as="element(item)*">
  <xsl:perform-sort select="$itemContent/item">
    <xsl:sort select="pub-date" order="descending"/>
  </xsl:perform-sort>
</xsl:variable>

然后使用位置分组

<xsl:for-each-group select="$sorted-items" group-by="(position() - 1) idiv 10">
  <ul>
     <xsl:apply-templates select="current-group()" mode="list"/>
  </ul>
</xsl:for-each-group>

您没有提供任何样本数据,您说该代码没有产生任何结果,但我现在尝试创建一个示例并将上面的代码片段合并到一个完整的样式表中,并创建了以下代码:

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
    xmlns:xs="http://www.w3.org/2001/XMLSchema"
    exclude-result-prefixes="xs"
    version="2.0">

    <xsl:output indent="yes"/>

    <xsl:template match="items">
        <xsl:copy>
            <xsl:variable name="itemContent" select="."/>
            <xsl:variable name="sorted-items" as="element(item)*">
                <xsl:perform-sort select="$itemContent/item">
                    <xsl:sort select="pub-date" order="descending"/>
                </xsl:perform-sort>
            </xsl:variable>
            <xsl:for-each-group select="$sorted-items" group-by="(position() - 1) idiv 10">
                <ul>
                    <xsl:apply-templates select="current-group()" mode="list"/>
                </ul>
            </xsl:for-each-group>           
        </xsl:copy>
    </xsl:template>

    <xsl:template match="item" mode="list">
        <li class="{position()}">
            <strong><a href="{url}"><xsl:value-of select="title" /> | <xsl:value-of select="position()" /></a></strong><br/>
            <xsl:value-of select="format-date(pub-date,'[FNn] [MNn] [D],  [Y]', 'en', (), ())" />
        </li>
    </xsl:template>

</xsl:stylesheet>

当我针对某些生成的样本数据运行时

<?xml version="1.0" encoding="UTF-8"?>
<items>
    <item>
        <title>item 1</title>
        <pub-date>2017-07-30+02:00</pub-date>
        <url>http://example.com/search?1</url>
    </item>
    <item>
        <title>item 2</title>
        <pub-date>2017-08-04+02:00</pub-date>
        <url>http://example.com/search?2</url>
    </item>
    <item>
        <title>item 3</title>
        <pub-date>2017-08-06+02:00</pub-date>
        <url>http://example.com/search?3</url>
    </item>
    <item>
        <title>item 4</title>
        <pub-date>2017-08-01+02:00</pub-date>
        <url>http://example.com/search?4</url>
    </item>
    <item>
        <title>item 5</title>
        <pub-date>2017-07-29+02:00</pub-date>
        <url>http://example.com/search?5</url>
    </item>
    <item>
        <title>item 6</title>
        <pub-date>2017-08-14+02:00</pub-date>
        <url>http://example.com/search?6</url>
    </item>
    <item>
        <title>item 7</title>
        <pub-date>2017-07-31+02:00</pub-date>
        <url>http://example.com/search?7</url>
    </item>
    <item>
        <title>item 8</title>
        <pub-date>2017-08-05+02:00</pub-date>
        <url>http://example.com/search?8</url>
    </item>
    <item>
        <title>item 9</title>
        <pub-date>2017-08-09+02:00</pub-date>
        <url>http://example.com/search?9</url>
    </item>
    <item>
        <title>item 10</title>
        <pub-date>2017-08-15+02:00</pub-date>
        <url>http://example.com/search?10</url>
    </item>
    <item>
        <title>item 11</title>
        <pub-date>2017-08-12+02:00</pub-date>
        <url>http://example.com/search?11</url>
    </item>
    <item>
        <title>item 12</title>
        <pub-date>2017-08-07+02:00</pub-date>
        <url>http://example.com/search?12</url>
    </item>
    <item>
        <title>item 13</title>
        <pub-date>2017-07-25+02:00</pub-date>
        <url>http://example.com/search?13</url>
    </item>
    <item>
        <title>item 14</title>
        <pub-date>2017-08-03+02:00</pub-date>
        <url>http://example.com/search?14</url>
    </item>
    <item>
        <title>item 15</title>
        <pub-date>2017-08-08+02:00</pub-date>
        <url>http://example.com/search?15</url>
    </item>
    <item>
        <title>item 16</title>
        <pub-date>2017-08-11+02:00</pub-date>
        <url>http://example.com/search?16</url>
    </item>
    <item>
        <title>item 17</title>
        <pub-date>2017-08-02+02:00</pub-date>
        <url>http://example.com/search?17</url>
    </item>
    <item>
        <title>item 18</title>
        <pub-date>2017-08-16+02:00</pub-date>
        <url>http://example.com/search?18</url>
    </item>
    <item>
        <title>item 19</title>
        <pub-date>2017-08-17+02:00</pub-date>
        <url>http://example.com/search?19</url>
    </item>
    <item>
        <title>item 20</title>
        <pub-date>2017-07-26+02:00</pub-date>
        <url>http://example.com/search?20</url>
    </item>
    <item>
        <title>item 21</title>
        <pub-date>2017-08-10+02:00</pub-date>
        <url>http://example.com/search?21</url>
    </item>
    <item>
        <title>item 22</title>
        <pub-date>2017-07-28+02:00</pub-date>
        <url>http://example.com/search?22</url>
    </item>
    <item>
        <title>item 23</title>
        <pub-date>2017-07-27+02:00</pub-date>
        <url>http://example.com/search?23</url>
    </item>
    <item>
        <title>item 24</title>
        <pub-date>2017-08-13+02:00</pub-date>
        <url>http://example.com/search?24</url>
    </item>
</items>

Saxon 9.7 HE输出

<?xml version="1.0" encoding="UTF-8"?>
<items>
   <ul>
      <li class="1">
         <strong>
            <a href="http://example.com/search?19">item 19 | 1</a>
         </strong>
         <br/>Thursday August 17,  2017</li>
      <li class="2">
         <strong>
            <a href="http://example.com/search?18">item 18 | 2</a>
         </strong>
         <br/>Wednesday August 16,  2017</li>
      <li class="3">
         <strong>
            <a href="http://example.com/search?10">item 10 | 3</a>
         </strong>
         <br/>Tuesday August 15,  2017</li>
      <li class="4">
         <strong>
            <a href="http://example.com/search?6">item 6 | 4</a>
         </strong>
         <br/>Monday August 14,  2017</li>
      <li class="5">
         <strong>
            <a href="http://example.com/search?24">item 24 | 5</a>
         </strong>
         <br/>Sunday August 13,  2017</li>
      <li class="6">
         <strong>
            <a href="http://example.com/search?11">item 11 | 6</a>
         </strong>
         <br/>Saturday August 12,  2017</li>
      <li class="7">
         <strong>
            <a href="http://example.com/search?16">item 16 | 7</a>
         </strong>
         <br/>Friday August 11,  2017</li>
      <li class="8">
         <strong>
            <a href="http://example.com/search?21">item 21 | 8</a>
         </strong>
         <br/>Thursday August 10,  2017</li>
      <li class="9">
         <strong>
            <a href="http://example.com/search?9">item 9 | 9</a>
         </strong>
         <br/>Wednesday August 9,  2017</li>
      <li class="10">
         <strong>
            <a href="http://example.com/search?15">item 15 | 10</a>
         </strong>
         <br/>Tuesday August 8,  2017</li>
   </ul>
   <ul>
      <li class="1">
         <strong>
            <a href="http://example.com/search?12">item 12 | 1</a>
         </strong>
         <br/>Monday August 7,  2017</li>
      <li class="2">
         <strong>
            <a href="http://example.com/search?3">item 3 | 2</a>
         </strong>
         <br/>Sunday August 6,  2017</li>
      <li class="3">
         <strong>
            <a href="http://example.com/search?8">item 8 | 3</a>
         </strong>
         <br/>Saturday August 5,  2017</li>
      <li class="4">
         <strong>
            <a href="http://example.com/search?2">item 2 | 4</a>
         </strong>
         <br/>Friday August 4,  2017</li>
      <li class="5">
         <strong>
            <a href="http://example.com/search?14">item 14 | 5</a>
         </strong>
         <br/>Thursday August 3,  2017</li>
      <li class="6">
         <strong>
            <a href="http://example.com/search?17">item 17 | 6</a>
         </strong>
         <br/>Wednesday August 2,  2017</li>
      <li class="7">
         <strong>
            <a href="http://example.com/search?4">item 4 | 7</a>
         </strong>
         <br/>Tuesday August 1,  2017</li>
      <li class="8">
         <strong>
            <a href="http://example.com/search?7">item 7 | 8</a>
         </strong>
         <br/>Monday July 31,  2017</li>
      <li class="9">
         <strong>
            <a href="http://example.com/search?1">item 1 | 9</a>
         </strong>
         <br/>Sunday July 30,  2017</li>
      <li class="10">
         <strong>
            <a href="http://example.com/search?5">item 5 | 10</a>
         </strong>
         <br/>Saturday July 29,  2017</li>
   </ul>
   <ul>
      <li class="1">
         <strong>
            <a href="http://example.com/search?22">item 22 | 1</a>
         </strong>
         <br/>Friday July 28,  2017</li>
      <li class="2">
         <strong>
            <a href="http://example.com/search?23">item 23 | 2</a>
         </strong>
         <br/>Thursday July 27,  2017</li>
      <li class="3">
         <strong>
            <a href="http://example.com/search?20">item 20 | 3</a>
         </strong>
         <br/>Wednesday July 26,  2017</li>
      <li class="4">
         <strong>
            <a href="http://example.com/search?13">item 13 | 4</a>
         </strong>
         <br/>Tuesday July 25,  2017</li>
   </ul>
</items>