xsl triying按计数排序

时间:2016-03-26 02:02:40

标签: xml sorting xslt count

我在尝试使用xml对元素数量进行排序时遇到错误:

SQL> create table x (id) as select 1 from dual union all select 1 from dual;
Table created.
Elapsed: 00:00:00.01

SQL> select * from x;
        ID
----------
         1
         1
2 rows selected.
Elapsed: 00:00:00.08

SQL> select id
  2  ,CASE WHEN COUNT(id ) > 1  THEN 'X'
  3   ELSE  ' ' END AS Dual
  4  from x
  5  group by id
  6  /

        ID DUAL
---------- ----
         1 X
1 row selected.
Elapsed: 00:00:00.13

我希望看到每个产品的“oferta”数量按产品的“oferta”数量排序,我正在使用以下xls进行操作:

<segma>
    <conservacio>
        <cons estat="A">Excel·lent conservació</cons>
        <cons estat="B">Bona conservació</cons>
        <cons estat="C">Regular conservació</cons>
        <cons estat="D">Mala conservació</cons>
    </conservacio>

    <categories>
        <categoria cat="1">Mobiliari</categoria>
        <categoria cat="2">Alimentació</categoria>
        <categoria cat="3">Roba</categoria>
    </categories>

    <clients>
        <registre dni="111">Marti</registre>
        <registre dni="222">Jana</registre>
        <registre dni="333">Edu</registre>
        <registre dni="444">Santi</registre>
        <registre dni="555">Mia</registre>
        <registre dni="666">Pau M</registre>        
    </clients>

    <productes>
        <prod id="1" cons="A" cat="1">
            <nom>Cuna</nom>
            <preu_nou>70</preu_nou>
            <preu>30</preu>
            <ofertes>
                <oferta client="111" />
                <oferta client="333" />
            </ofertes>
            <venta client="111" />
        </prod>

        <prod id="2" cons="B" cat="2">
            <nom>Baby cook</nom>
            <preu_nou>120</preu_nou>
            <preu>60</preu>
            <ofertes>
                <oferta client="111" />
                <oferta client="333" />
                <oferta client="444" />
                <oferta client="555" />

                </ofertes>
            <venta client="555" />
        </prod>         

        <prod id="3" cons="A" cat="1">
            <nom>Mama pata</nom>
            <preu_nou>70</preu_nou>
            <preu>5</preu>
            <ofertes>
                <oferta client="444" />
                <oferta client="555" />
            </ofertes>
            <venta client="444" />
        </prod>     

        <prod id="4" cons="B" cat="3">
            <nom>Conjunt xandall</nom>
            <preu_nou>40</preu_nou>
            <preu>15</preu>
            <ofertes>
                <oferta client="222" />
                <oferta client="555" />
            </ofertes>
            <venta client="222" />
        </prod> 

        <prod id="5" cons="C" cat="3">
            <nom>Pack 3 texans</nom>
            <preu_nou>70</preu_nou>
            <preu>25</preu>
            <ofertes>
                <oferta client="333" />
                <oferta client="444" />
                <oferta client="555" />
            </ofertes>
            <venta client="333" />
        </prod> 

        <prod id="6" cons="A" cat="2">
            <nom>Saca leches</nom>
            <preu_nou>130</preu_nou>
            <preu>70</preu>
            <ofertes>
                <oferta client="111" />
                <oferta client="222" />
                <oferta client="555" />
            </ofertes>
            <venta client="111" />
        </prod>     

        <prod id="7" cons="C" cat="2">
            <nom>Llet continuació</nom>
            <preu_nou>11</preu_nou>
            <preu>3</preu>
            <ofertes>
            </ofertes>
        </prod>             

    </productes>
</segma>

我想要输出如下:

<h2>Ex 7</h2>
<table border="1">  
  <xsl:for-each select="//prod"> 
    <xsl:variable name="producte" select="@id"/>  
    <xsl:variable name="contador" select="count(//prod[@id=$producte]/ofertes/oferta)"/>  
    <xsl:sort select="$contador"/>  
    <tr> 
      <td>
        <xsl:value-of select="nom"/>
      </td>  
      <td>
        <xsl:value-of select="$contador"/>
      </td> 
    </tr> 
  </xsl:for-each> 
</table>

有人能告诉我为什么我遇到麻烦吗?

1 个答案:

答案 0 :(得分:1)

由于foreach中的上下文是prod元素,因此您只需执行count(ofertes/oferta)即可从当前上下文prod获取计数。您似乎也想要降序订单中的结果:

<table border="1">  
  <xsl:for-each select="//prod"> 
    <xsl:sort select="count(ofertes/oferta)" order="descending" /> 
    <tr> 
      <td>
        <xsl:value-of select="nom"/>
      </td>  
      <td>
        <xsl:value-of select="count(ofertes/oferta)"/>
      </td> 
    </tr> 
  </xsl:for-each> 
</table>