html - xsl 聚合或子查询

标签 html xml xslt

对于具有以下结构的 XML 文件

 <?xml version="1.0" encoding="UTF-8">
 <farm xmlns:my="mynamespace.com" >
   <pen>
    <sheep> 3 </sheep>
    <cow> 3</cow>
    <pig> 2</pig>
    <chicken> 5</chicken>
   </pen>
  <pen>
    <sheep> 12 </sheep>
    <cow> 1</cow>
    <pig> 2</pig>
    <chicken> 4</chicken>
   </pen>
  <pen>
    <sheep> 4 </sheep>
    <cow> 4</cow>
    <pig> 1</pig>
    <chicken> 2</chicken>
   </pen>
 </farm>

我有一个 xsl 样式表,它循环遍历每个笔节点(for-each),为每种动物类型(即羊、牛、 pig 和鸡)生成一个 id,并计算总数。生成如下表

ANIMAL   | VALUE
-----------------
pig      |  5
cow      |  8
sheep    | 19
chickens | 11

现在我想按值列对结果集进行排序 是否可以使用 XSL 执行与子查询相同的操作?

最佳答案

此 XSLT 1.0 转换:

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

 <xsl:key name="kAnimalByName" match="pen/*" use="name()"/>

 <xsl:template match="/*">
     <table border="1">
      <thead>
          <tr>
           <td>Animal</td>
           <td>Total</td>
          </tr>
      </thead>
      <tbody>
       <xsl:apply-templates select=
        "/*/pen/*
           [generate-id()
           =
            generate-id(key('kAnimalByName', name())[1])
            ]">
         <xsl:sort select="sum(/*/pen/*[name() = name(current())])"
                   data-type="number"/>
       </xsl:apply-templates>
      </tbody>
     </table>
 </xsl:template>

 <xsl:template match="pen/*">
  <tr>
   <td><xsl:value-of select="name()"/></td>
   <td>
     <xsl:value-of select="sum(/*/pen/*[name() = name(current())])"/>
   </td>
  </tr>
 </xsl:template>
</xsl:stylesheet>

应用于提供的 XML 文档时:

<farm xmlns:my="mynamespace.com" >
    <pen>
        <sheep> 3 </sheep>
        <cow> 3</cow>
        <pig> 2</pig>
        <chicken> 5</chicken>
    </pen>
    <pen>
        <sheep> 12 </sheep>
        <cow> 1</cow>
        <pig> 2</pig>
        <chicken> 4</chicken>
    </pen>
    <pen>
        <sheep> 4 </sheep>
        <cow> 4</cow>
        <pig> 1</pig>
        <chicken> 2</chicken>
    </pen>
</farm>

产生想要的正确结果:

<table border="1">
   <thead>
      <tr>
         <td>Animal</td>
         <td>Total</td>
      </tr>
   </thead>
   <tbody>
      <tr>
         <td>pig</td>
         <td>5</td>
      </tr>
      <tr>
         <td>cow</td>
         <td>8</td>
      </tr>
      <tr>
         <td>chicken</td>
         <td>11</td>
      </tr>
      <tr>
         <td>sheep</td>
         <td>19</td>
      </tr>
   </tbody>
</table>

说明:正确使用 Muenchian method for grouping

关于html - xsl 聚合或子查询,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10726985/

相关文章:

java - 如何从android中的xml标签获取特定值

java - 包含 XML 模式本地副本的 XML 文件

java - XML-FO 嵌套列表 block

xml - XSLT中的总金额

javascript - 文档模板 : JavaScript as replacement for Word?

javascript - 尽管用户名和密码正确,但 PHP 和 Javascript 登录不起作用

css - 标题 div 高度不包括绝对定位的 div

html - 目录 XSL

html - 图片未显示在移动设备上

html - box-shadow 在 ie-8 中不工作