Xslt Xsl分组重复问题

Xslt Xsl分组重复问题,xslt,Xslt,我的XML看起来像这样 <page> <orderhistory> <order> <ordernr>10610000000001</ordernr> <orderrecord> <productcategory>Something</productcategory> </orderrecord>

我的XML看起来像这样

<page>   
 <orderhistory>   
  <order>   
   <ordernr>10610000000001</ordernr>    
     <orderrecord>   
        <productcategory>Something</productcategory> 
     </orderrecord>   
     <orderrecord>   
        <productcategory>Something</productcategory> 
     </orderrecord>   
     <orderrecord>   
        <productcategory>Something</productcategory> 
    </orderrecord>   
   </order>   
   <order>   
    <ordernr>10210000000001</ordernr>    
     <orderrecord>   
       <productcategory>Something</productcategory> 
     </orderrecord>   
  </order>   
  <order>   
 <ordernr>10110000000001</ordernr>    
 <orderrecord>   
 <productcategory>Something</productcategory> 
  </orderrecord>   
  </order>   
  <order>   
   <ordernr>10310000000001</ordernr>    
   <orderrecord>   
   <productcategory>Something</productcategory> 
   </orderrecord>   
   <orderrecord>   
      <productcategory>Forms</productcategory> 
   </orderrecord>   
  </order>   
</orderhistory>   
03-06-2009 10610000000001 something  something
03-06-2009 10210000000001 something
03-06-2009 10110000000001 something
03-05-2009 10310000000001 Forms something
我创建了一个XSL来对orderrecords中的productcategories进行分组,以便删除重复项。它似乎工作得很好,但问题是我希望它按顺序分组

<xsl:key name="orderrecord-by-productcategory" match="orderrecord" use="productcategory" />
<xsl:template match="/page/orderhistory/order"> 
<xsl:for-each select="orderrecord[generate-id(.) =generate-id(key('artists-by-country', productcategory)[1])]" >
<xsl:value-of select="productcategory" />
</xsl:for-each>
</xsl:template>
但我希望它看起来像这样

03-06-2009 10610000000001 something
03-06-2009 10210000000001 something
03-06-2009 10110000000001 something
03-05-2009 10310000000001 Forms something

如何做到这一点?

我认为一种方法是使用一个包含订单号和产品类别的键,以便对不同订单的重复类别进行不同的处理

<xsl:key name="prodcat" match="productcategory" use="concat(../../ordernr/text(), concat('-', text()))"/>

这将连接订单号、连字符(可能不需要)和产品类别。您的XSL可以如下所示:

<?xml version="1.0"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:output method="text" />
    <xsl:key name="prodcat" match="productcategory" use="concat(../../ordernr/text(), concat('-', text()))"/>
    <xsl:template match="/page/orderhistory">
        <xsl:for-each select="order">
            <xsl:value-of select="ordernr" />
            <xsl:for-each select="orderrecord/productcategory[generate-id(.) = generate-id( key( 'prodcat', concat(../../ordernr/text(), concat('-', text())) )[1] )]">
                <xsl:sort select="text()" />
                <xsl:value-of select="." />
            </xsl:for-each>
        </xsl:for-each>
    </xsl:template>
</xsl:stylesheet>

在生成的输出中没有任何换行符或空格,但我希望它能为您提供总体思路

<?xml version="1.0"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:output method="text" />
    <xsl:key name="prodcat" match="productcategory" use="concat(../../ordernr/text(), concat('-', text()))"/>
    <xsl:template match="/page/orderhistory">
        <xsl:for-each select="order">
            <xsl:value-of select="ordernr" />
            <xsl:for-each select="orderrecord/productcategory[generate-id(.) = generate-id( key( 'prodcat', concat(../../ordernr/text(), concat('-', text())) )[1] )]">
                <xsl:sort select="text()" />
                <xsl:value-of select="." />
            </xsl:for-each>
        </xsl:for-each>
    </xsl:template>
</xsl:stylesheet>