使用XSL进行渲染时更改XML的顺序

时间:2017-01-24 11:52:26

标签: html xml xslt web

我有一个问题,我想以特定顺序在浏览器中呈现汽车列表,但XML的顺序不同(不能更改)。

如何编写我的XSL以按照最高速度排列相同品牌的汽车?

XML:

<?xml version="1.0" encoding="UTF-8"?>
<Vehicle>
    <Car>
        <Make>Audi</Make>
        <Model>R8</Model>
        <TopSpeed>200</TopSpeed>
    </Car>
    <Car>
        <Make>Lamborghini</Make>
        <Model>Aventador</Model>
        <TopSpeed>250</TopSpeed>
    </Car>
    <Car>
        <Make>Ferrari</Make>
        <Model>TDF</Model>
        <TopSpeed>220</TopSpeed>
    </Car>
    <Car>
        <Make>Lamborghini</Make>
        <Model>Gallardo</Model>
        <TopSpeed>200</TopSpeed>
    </Car>
</Vehicle>

XSL:

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:template match="/">
<html> 
<body>
  <h2>My Car Collection</h2>
  <table border="1">
    <tr bgcolor="#9acd32">
      <th style="text-align:left">Make</th>
      <th style="text-align:left">Model</th>
      <th style="text-align:left">Top Speed</th>
    </tr>
    <xsl:for-each select="Vehicle/Car">
    <tr>
      <td><xsl:value-of select="Make"/></td>
      <td><xsl:value-of select="Model"/></td>
      <td><xsl:value-of select="TopSpeed"/></td>
    </tr>
    </xsl:for-each>
  </table>
</body>
</html>
</xsl:template>
</xsl:stylesheet>

按以下顺序输出表格:

  • 奥迪R8
  • 兰博基尼Aventador
  • 法拉利TDF
  • 兰博基尼盖拉多

但是我试图让两个兰博基尼在订单之后出现一个,最高的最高速度。

任何帮助将不胜感激。

2 个答案:

答案 0 :(得分:1)

如评论所示,请考虑使用 $(".event-date-visit").each(function() { $(this).detach().prependTo($(this).closest('.wp-posts-carousel-image')); });

运行Muenchian分组
<xsl:sort>

<强>输出

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
<xsl:output version="1.0" encoding="UTF-8" indent="yes" />
<xsl:strip-space elements="*"/>

  <xsl:key name="makeid" match="Car" use="Make" />

  <xsl:template match="Vehicle">
    <html>
    <body>
      <h2>My Car Collection</h2>
      <table border="1">
       <tr bgcolor="#9acd32">
         <th style="text-align:left">Make</th>
         <th style="text-align:left">Model</th>
         <th style="text-align:left">Top Speed</th>
       </tr>              
       <xsl:apply-templates select="Car[generate-id() = generate-id(key('makeid', Make)[1])]"/>        
      </table>
    </body>
    </html>
  </xsl:template>

  <xsl:template match="Car[generate-id() = generate-id(key('makeid', Make)[1])]">        
        <xsl:for-each select="key('makeid',Make)">    
          <xsl:sort select="TopSpeed" order="descending" data-type="number"/>      
          <tr>
            <td><xsl:value-of select="Make"/></td>
            <td><xsl:value-of select="Model"/></td>
            <td><xsl:value-of select="TopSpeed"/></td>
          </tr>              
        </xsl:for-each>              
  </xsl:template>

</xsl:stylesheet>

HTML Output

答案 1 :(得分:0)

这是Muenchian分组的另一个例子,但略有不同。它也会按照Top Speed排序之前按Make排序。

XML输入(修改后更不顺序)

<Vehicle>
    <Car>
        <Make>Lamborghini</Make>
        <Model>Gallardo</Model>
        <TopSpeed>200</TopSpeed>
    </Car>
    <Car>
        <Make>Audi</Make>
        <Model>R8</Model>
        <TopSpeed>200</TopSpeed>
    </Car>
    <Car>
        <Make>Lamborghini</Make>
        <Model>Aventador</Model>
        <TopSpeed>250</TopSpeed>
    </Car>
    <Car>
        <Make>Ferrari</Make>
        <Model>TDF</Model>
        <TopSpeed>220</TopSpeed>
    </Car>
</Vehicle>

XSLT 1.0

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
  <xsl:output indent="yes"/>
  <xsl:strip-space elements="*"/>

  <xsl:key name="carsByMake" match="Car" use="Make"/>

  <xsl:template match="/*">
    <html> 
      <body>
        <h2>My Car Collection</h2>
        <table border="1">
          <tr bgcolor="#9acd32">
            <th style="text-align:left">Make</th>
            <th style="text-align:left">Model</th>
            <th style="text-align:left">Top Speed</th>
          </tr>
          <xsl:for-each select="Car[count(.|key('carsByMake',Make)[1])=1]">
            <xsl:sort select="Make"/>
            <xsl:for-each select="key('carsByMake',Make)">
              <xsl:sort select="TopSpeed" order="descending"/>
              <tr>
                <td><xsl:value-of select="Make"/></td>
                <td><xsl:value-of select="Model"/></td>
                <td><xsl:value-of select="TopSpeed"/></td>
              </tr>
            </xsl:for-each>
          </xsl:for-each>
        </table>
      </body>
    </html>
  </xsl:template>

</xsl:stylesheet>

<强>输出

&#13;
&#13;
<html>
   <body>
      <h2>My Car Collection</h2>
      <table border="1">
         <tr bgcolor="#9acd32">
            <th style="text-align:left">Make</th>
            <th style="text-align:left">Model</th>
            <th style="text-align:left">Top Speed</th>
         </tr>
         <tr>
            <td>Audi</td>
            <td>R8</td>
            <td>200</td>
         </tr>
         <tr>
            <td>Ferrari</td>
            <td>TDF</td>
            <td>220</td>
         </tr>
         <tr>
            <td>Lamborghini</td>
            <td>Aventador</td>
            <td>250</td>
         </tr>
         <tr>
            <td>Lamborghini</td>
            <td>Gallardo</td>
            <td>200</td>
         </tr>
      </table>
   </body>
</html>
&#13;
&#13;
&#13;