1

假设我正在从任意 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

我怎样才能优雅地解决这个问题?

4

1 回答 1

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>

这样做是使用谓词仅对population每个国家/地区的值进行求和,其中continent值包含您要求和的大陆的名称。因此,如果列出的大陆不止一个,这将多次计算相同的人口。

于 2013-10-30T13:27:41.590 回答