XSLT聚合,使用基于Muenchian方法的最小和最大排序

完美的

我了解Muenchian方法在初读时会对整个文档建立索引。但是如何在分组之前或分组中而不是在其密钥上进行排序?具体来说,如何计算键的同级关系,以便计算一系列元素值的最小值和最大值?

如下XML数据所示,我试图按行业汇总公司。在七个指标(收入,资产,权益,净收入,股票价格和员工)中,我可以实现各种汇总:的总和与的sum()平均值sum() div count()但是,为了获得特别是净收入的最小值和最大值,我需要按净收入对行业内的公司进行排序,然后选择a处的值position()请注意,每个行业恰好有五家公司。因此,对于减少净收入排序,position()=1是最大值,position()=5而最小值。

现在,我可以运行两个XSLT脚本来达到预期的效果第一类和第二类集合。但是如何使用一个XSLT来做到这一点for each loopMuenchian密钥中,我尝试了以下所有方法,但均无济于事。

<xsl:sort select="../netincome" data-type="number" order="descending"/>

<xsl:sort select="key('indkey', .)/../netincome" data-type="number" order="descending"/>

<xsl:sort select="key('indkey', .)[../netincome]" data-type="number" order="descending"/>

最小值和最大值可能必须在其他模板之外的模板中完成,或者运行XSLT脚本的两个pass / call模板或使用<xsl:with-params>

XML数据

<?xml version="1.0" encoding="UTF-8"?>
<data>
    <bigcompany>
        <company>Company OA</company>
        <industry>Oil &amp; Gas</industry>
        <revenue>394105000000</revenue>
        <assets>349493000000</assets>
        <equity>174399000000</equity>
        <netincome>32520000000</netincome>
        <stockprice>89.38</stockprice>
        <employees>75300</employees>
    </bigcompany>
    <bigcompany>
        <company>Company OB</company>
        <industry>Oil &amp; Gas</industry>
        <revenue>200494000000</revenue>
        <assets>266026000000</assets>
        <equity>156191000000</equity>
        <netincome>19241000000</netincome>
        <stockprice>108.62</stockprice>
        <employees>64700</employees>
    </bigcompany>
    <bigcompany>
        <company>Company OC</company>
        <industry>Oil &amp; Gas</industry>
        <revenue>13807000000</revenue>
        <assets>4726000000</assets>
        <equity>16445000000</equity>
        <netincome>2720000000</netincome>
        <stockprice>48.5</stockprice>
        <employees>22000</employees>
    </bigcompany>
    <bigcompany>
        <company>Company OD</company>
        <industry>Oil &amp; Gas</industry>
        <revenue>97800000000</revenue>
        <assets>30500000000</assets>
        <equity>10800000000</equity>
        <netincome>2700000000</netincome>
        <stockprice>27.53</stockprice>
        <employees>45340</employees>
    </bigcompany>
    <bigcompany>
        <company>Company OE</company>
        <industry>Oil &amp; Gas</industry>
        <revenue>62004000000</revenue>
        <assets>117144000000</assets>
        <equity>48427000000</equity>
        <netincome>8428000000</netincome>
        <stockprice>66.66</stockprice>
        <employees>16900</employees>
    </bigcompany>
    <bigcompany>
        <company>Company PA</company>
        <industry>Pharmaceuticals</industry>
        <revenue>49605000000</revenue>
        <assets>169274000000</assets>
        <equity>71622000000</equity>
        <netincome>9135000000</netincome>
        <stockprice>30.14</stockprice>
        <employees>78000</employees>
    </bigcompany>
    <bigcompany>
        <company>Company PB</company>
        <industry>Pharmaceuticals</industry>
        <revenue>48047000000</revenue>
        <assets>105128000000</assets>
        <equity>56943000000</equity>
        <netincome>6272000000</netincome>
        <stockprice>55.43</stockprice>
        <employees>76000</employees>
    </bigcompany>
    <bigcompany>
        <company>Company PC</company>
        <industry>Pharmaceuticals</industry>
        <revenue>74331000000</revenue>
        <assets>131119000000</assets>
        <equity>69752000000</equity>
        <netincome>16323000000</netincome>
        <stockprice>102.31</stockprice>
        <employees>126500</employees>
    </bigcompany>
    <bigcompany>
        <company>Company PD</company>
        <industry>Pharmaceuticals</industry>
        <revenue>23113000000</revenue>
        <assets>35249000000</assets>
        <equity>17641000000</equity>
        <netincome>4685000000</netincome>
        <stockprice>67.2</stockprice>
        <employees>37925</employees>
    </bigcompany>
    <bigcompany>
        <company>Company PE</company>
        <industry>Pharmaceuticals</industry>
        <revenue>15879000000</revenue>
        <assets>33749000000</assets>
        <equity>14852000000</equity>
        <netincome>2004000000</netincome>
        <stockprice>58</stockprice>
        <employees>28000</employees>
    </bigcompany>
    <bigcompany>
        <company>Company MA</company>
        <industry>Media</industry>
        <revenue>48813000000</revenue>
        <assets>84186000000</assets>
        <equity>44958000000</equity>
        <netincome>8004000000</netincome>
        <stockprice>93.65</stockprice>
        <employees>180000</employees>
    </bigcompany>
    <bigcompany>
        <company>Company MB</company>
        <industry>Media</industry>
        <revenue>64657000000</revenue>
        <assets>158813000000</assets>
        <equity>51058000000</equity>
        <netincome>7135000000</netincome>
        <stockprice>57.05</stockprice>
        <employees>139000</employees>
    </bigcompany>
    <bigcompany>
        <company>Company MC</company>
        <industry>Media</industry>
        <revenue>31867000000</revenue>
        <assets>54793000000</assets>
        <equity>17418000000</equity>
        <netincome>4514000000</netincome>
        <stockprice>36.52</stockprice>
        <employees>27000</employees>
    </bigcompany>
    <bigcompany>
        <company>TCompany MD</company>
        <industry>Media</industry>
        <revenue>29795000000</revenue>
        <assets>67994000000</assets>
        <equity>29904000000</equity>
        <netincome>3691000000</netincome>
        <stockprice>84.3</stockprice>
        <employees>26000</employees>
    </bigcompany>
    <bigcompany>
        <company>Company ME</company>
        <industry>Media</industry>
        <revenue>15284000000</revenue>
        <assets>26387000000</assets>
        <equity>9966000000</equity>
        <netincome>1879000000</netincome>
        <stockprice>54.88</stockprice>
        <employees>20915</employees>
    </bigcompany>
</data>

XSLT 1

<?xml version="1.0" encoding="UTF-8"?>
<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:template match="data">
    <xsl:copy>
      <xsl:apply-templates>        
        <xsl:sort select="industry" order="ascending"/>
        <xsl:sort select="netincome" data-type="number" order="descending"/> 
      </xsl:apply-templates>
    </xsl:copy>
  </xsl:template>

  </xsl:stylesheet>

XSLT 2

<?xml version="1.0" encoding="UTF-8"?>
<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="indkey" match="bigcompany/industry" use="."/>

  <xsl:template match="data">
    <data>
    <xsl:for-each select="bigcompany/industry[generate-id()    
                         = generate-id(key('indkey', .)[1])]">  
      <xsl:sort select="." order="ascending"/>                    

        <aggdata>
          <xsl:copy-of select="."/>        
          <SumOfRevenue><xsl:copy-of select="sum(key('indkey', .)/../revenue)"/></SumOfRevenue>
          <AvgOfAssets><xsl:copy-of select="sum(key('indkey', .)/../assets) div count(key('indkey', .)/../assets)"/></AvgOfAssets>
          <AvgOfEquity><xsl:copy-of select="sum(key('indkey', .)/../equity) div count(key('indkey', .)/../equity)"/></AvgOfEquity>
          <MaxOfIncome><xsl:value-of select="key('indkey', .)[1]/../netincome"/></MaxOfIncome>
          <MinOfIncome><xsl:value-of select="key('indkey', .)[5]/../netincome"/></MinOfIncome>
          <AvgOfStockPrice><xsl:copy-of select="sum(key('indkey', .)/../stockprice) div count(key('indkey', .)/../stockprice)"/></AvgOfStockPrice>
          <SumOfEmployees><xsl:copy-of select="sum(key('indkey', .)/../employees)"/></SumOfEmployees>
        </aggdata>

    </xsl:for-each>

    </data>
  </xsl:template>
</xsl:stylesheet>

最终结果和所需结果 -但是如何使用XSLT?

<?xml version='1.0' encoding='UTF-8'?>
<data>
  <aggdata>
    <industry>Media</industry>
    <SumOfRevenue>1.90416e+011</SumOfRevenue>
    <AvgOfAssets>7.84346e+010</AvgOfAssets>
    <AvgOfEquity>3.06608e+010</AvgOfEquity>
    <MaxOfIncome>8004000000</MaxOfIncome>
    <MinOfIncome>1879000000</MinOfIncome>
    <AvgOfStockPrice>65.28</AvgOfStockPrice>
    <SumOfEmployees>392915</SumOfEmployees>
  </aggdata>
  <aggdata>
    <industry>Oil &amp; Gas</industry>
    <SumOfRevenue>7.6821e+011</SumOfRevenue>
    <AvgOfAssets>1.535778e+011</AvgOfAssets>
    <AvgOfEquity>8.12524e+010</AvgOfEquity>
    <MaxOfIncome>32520000000</MaxOfIncome>
    <MinOfIncome>2700000000</MinOfIncome>
    <AvgOfStockPrice>68.138</AvgOfStockPrice>
    <SumOfEmployees>224240</SumOfEmployees>
  </aggdata>
  <aggdata>
    <industry>Pharmaceuticals</industry>
    <SumOfRevenue>2.10975e+011</SumOfRevenue>
    <AvgOfAssets>9.49038e+010</AvgOfAssets>
    <AvgOfEquity>4.6162e+010</AvgOfEquity>
    <MaxOfIncome>16323000000</MaxOfIncome>
    <MinOfIncome>2004000000</MinOfIncome>
    <AvgOfStockPrice>62.616</AvgOfStockPrice>
    <SumOfEmployees>346425</SumOfEmployees>
  </aggdata>
</data>
michael.hor257k

这样呢

XSLT 1.0

<xsl:stylesheet version="1.0" 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:exsl="http://exslt.org/common"
extension-element-prefixes="exsl">
<xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/>
<xsl:strip-space elements="*"/>

<xsl:key name="co-by-ind" match="bigcompany" use="industry" />

<xsl:template match="/data">
    <xsl:copy>
        <xsl:for-each select="bigcompany[generate-id() = generate-id(key('co-by-ind', industry)[1])]">  
            <xsl:sort select="industry" data-type="text" order="ascending"/>                   
            <!-- variables -->
            <xsl:variable name="curr-group" select="key('co-by-ind', industry)" />
            <xsl:variable name="income-sorted">
                <xsl:for-each select="$curr-group">
                    <xsl:sort select="netincome" data-type="number" order="ascending"/>
                    <xsl:copy-of select="netincome"/>
                </xsl:for-each>
            </xsl:variable>
            <xsl:variable name="income-sorted-set" select="exsl:node-set($income-sorted)/netincome" />
            <!-- output -->
            <aggdata>
                <xsl:copy-of select="industry"/>        
                <SumOfRevenue>
                    <xsl:value-of select="sum($curr-group/revenue)"/>
                </SumOfRevenue>
                <AvgOfAssets>
                    <xsl:value-of select="sum($curr-group/assets) div count($curr-group/assets)"/>
                </AvgOfAssets>
                <AvgOfEquity>
                    <xsl:value-of select="sum($curr-group/equity) div count($curr-group/equity)"/>
                </AvgOfEquity>
                <MaxOfIncome>
                    <xsl:value-of select="$income-sorted-set[last()]"/>
                </MaxOfIncome>
                <MinOfIncome>
                    <xsl:value-of select="$income-sorted-set[1]"/>
                </MinOfIncome>
                <AvgOfStockPrice>
                    <xsl:value-of select="sum($curr-group/stockprice) div count($curr-group/stockprice)"/>
                </AvgOfStockPrice>
                <SumOfEmployees>
                    <xsl:value-of select="sum($curr-group/employees)"/>
                </SumOfEmployees>
            </aggdata>
        </xsl:for-each>
    </xsl:copy>
</xsl:template>

</xsl:stylesheet>

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

使用XSLT 1.0版进行Muenchian分组,排序和过滤

来自分类Dev

使用向量而不是C ++中的数组将数字从最小到最大排序

来自分类Dev

如何使用`tree`命令行工具从最小到最大排序?

来自分类Dev

根据类内的值从最小到最大排序

来自分类Dev

根据类内的值从最小到最大排序

来自分类Dev

此函数是否将整数从最小到最大排序?

来自分类Dev

从最小到最大排序一个数组

来自分类Dev

从最小到最大排序 3 个数字

来自分类Dev

如何从最小到最大排序时间和日期,以便按时间顺序在PHP中提取数据?

来自分类Dev

没有if语句,如何从最小到最大排序一组整数?

来自分类Dev

我一直在尝试将我现在合并的数组从最小到最大排序

来自分类Dev

从最小到最大排序列表,不带list.sort()

来自分类Dev

XSLT Muenchian方法

来自分类Dev

寻找最大排序的子序列

来自分类Dev

SQL按子项的最大排序

来自分类Dev

如果每次返回循环时都替换了数据,如何将循环中的数据从最小到最大排序?

来自分类Dev

按xslt排序并选择最小值或最大值

来自分类Dev

使用XSLT 1.0 Muenchian分组创建HTML输出时,排序失败

来自分类Dev

MongoDB最小/最大聚合

来自分类Dev

使用熊猫获得最小和最大的优雅方法

来自分类Dev

使用最小和最大限制的tryparse方法

来自分类Dev

堆排序和反向堆排序(最大/最小堆)

来自分类Dev

堆排序-用于升序和降序排序的堆(最小/最大)?

来自分类Dev

所有节点的 XSLT MUENCHIAN 方法

来自分类Dev

如何使用定义的最小值和最大值对数据进行排序

来自分类Dev

使用XSLT muenchian-group的嵌套分组

来自分类Dev

使用XSLT muenchian-group的嵌套分组

来自分类Dev

结果未使用聚合和MongoDB排序

来自分类Dev

如何单独基于最小和最大创建箱形图

Related 相关文章

  1. 1

    使用XSLT 1.0版进行Muenchian分组,排序和过滤

  2. 2

    使用向量而不是C ++中的数组将数字从最小到最大排序

  3. 3

    如何使用`tree`命令行工具从最小到最大排序?

  4. 4

    根据类内的值从最小到最大排序

  5. 5

    根据类内的值从最小到最大排序

  6. 6

    此函数是否将整数从最小到最大排序?

  7. 7

    从最小到最大排序一个数组

  8. 8

    从最小到最大排序 3 个数字

  9. 9

    如何从最小到最大排序时间和日期,以便按时间顺序在PHP中提取数据?

  10. 10

    没有if语句,如何从最小到最大排序一组整数?

  11. 11

    我一直在尝试将我现在合并的数组从最小到最大排序

  12. 12

    从最小到最大排序列表,不带list.sort()

  13. 13

    XSLT Muenchian方法

  14. 14

    寻找最大排序的子序列

  15. 15

    SQL按子项的最大排序

  16. 16

    如果每次返回循环时都替换了数据,如何将循环中的数据从最小到最大排序?

  17. 17

    按xslt排序并选择最小值或最大值

  18. 18

    使用XSLT 1.0 Muenchian分组创建HTML输出时,排序失败

  19. 19

    MongoDB最小/最大聚合

  20. 20

    使用熊猫获得最小和最大的优雅方法

  21. 21

    使用最小和最大限制的tryparse方法

  22. 22

    堆排序和反向堆排序(最大/最小堆)

  23. 23

    堆排序-用于升序和降序排序的堆(最小/最大)?

  24. 24

    所有节点的 XSLT MUENCHIAN 方法

  25. 25

    如何使用定义的最小值和最大值对数据进行排序

  26. 26

    使用XSLT muenchian-group的嵌套分组

  27. 27

    使用XSLT muenchian-group的嵌套分组

  28. 28

    结果未使用聚合和MongoDB排序

  29. 29

    如何单独基于最小和最大创建箱形图

热门标签

归档