2009-06-04 114 views
1

我的XML看起来像这样XSL分组复制问题

<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> 

我要的是表明属于一个订单的所有productcategories。所以如果有一个订单中有更多的订单记录,我想显示所有类别,其次是订单号 。

但它看起来像这样

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

我从orderrecords做了XSL来分组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 
03-06-2009 10110000000001 
03-05-2009 10310000000001 Forms 

,但我希望它看起来是这样的。

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

我该怎么做?

回答

2

我认为要做到这一点的方法之一是使用一个密钥是订单数量的concetation和产品类别,这样重复的类别不同订单的处理方式不同

<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> 

有没有产生输出的任何换行符或空格,但我希望它给你的总体思路。