xsl group by属性multiple

时间:2013-10-29 19:24:15

标签: xml xslt xpath

假设我正在从一种任意的XML格式转换为HTML格式,我希望按照人口数量(跨越两大洲的国家/地区)的名称对各大洲名称进行排序。

我只能使用(老师的约束):

decimal-format,output, template, sort, variable, for-each, value-of, format

所以我不能使用“xsl:for-each-group”。

以下是我正在研究的示例XML结构:

<monde>
   <pays superficie="647500" code="AFG" capital="cty-Afghanistan-Kabul" continent="asia">
      <nom>Afghanistan</nom>
      <population>22664136</population>
      <frontieres>
         <frontiere codePays="TJ" longueur="76"/>
         <frontiere codePays="IR" longueur="936"/>
         <frontiere codePays="PK" longueur="2430"/>
         <frontiere codePays="TAD" longueur="1206"/>
         <frontiere codePays="TM" longueur="744"/>
         <frontiere codePays="UZB" longueur="137"/>
      </frontieres>
      <religions>
         <religion pourcentage="99">Muslim</religion>
      </religions>
      <villes>
         <ville>
            <nom>Kabul</nom>
            <population>892000</population>
         </ville>
      </villes>
   </pays>
   <pays superficie="28750" code="AL" capital="cty-cid-cia-Albania-Tirane"
         continent="europe"> ...

有些国家遍布两大洲:

<pays superficie="780580" code="TR" ...
         continent="europe asia">
...

我们需要的输出示例

<table>
 <tr>
    <td>africa</td><td>667 586 143</td>
    <td>america</td><td>784 256 501</td>
    <td>asia</td><td>3 231 410 618</td>
    <td>australia</td><td>29 765 885</td>
    <td>europe</td><td>580 580 439</td>
 </tr>
</table

如何以优雅的方式解决这个问题?

1 个答案:

答案 0 :(得分:0)

我不知道这个解决方案有多优雅,但它会为您提供您正在寻找的输出,它只使用您受限的元素。

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
  <xsl:output method="html"/>
  <xsl:template match="monde">
    <table>
      <tr>
        <td>Africa</td>
        <td>
          <xsl:value-of select="sum(pays[contains(@continent,'africa')]/population)" />
        </td>
        <td>America</td>
        <td>
          <xsl:value-of select="sum(pays[contains(@continent,'america')]/population)" />
        </td>
        <td>Asia</td>
        <td>
          <xsl:value-of select="sum(pays[contains(@continent,'asia')]/population)" />
        </td>
        <td>Australia</td>
        <td>
          <xsl:value-of select="sum(pays[contains(@continent,'australia')]/population)" />
        </td>
        <td>Europe</td>
        <td>
          <xsl:value-of select="sum(pays[contains(@continent,'europe')]/population)" />
        </td>
      </tr>
    </table>
  </xsl:template>
</xsl:stylesheet>

这样做是使用predicate仅对population值包含您想要求的大陆名称的每个国家/地区的continent求和。因此,如果列出多个大陆,则会多次计算相同的人口数。