Xsl группировки дубликатов проблема - PullRequest
1 голос
/ 04 июня 2009

Мой 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 для группировки категорий товаров из записей заказов, чтобы дубликаты были удалены. Казалось, работает нормально, но проблема в том, что я хочу, чтобы он был сгруппирован по порядку.

<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

Как я могу это сделать?

1 Ответ

2 голосов
/ 04 июня 2009

Я думаю, что один из способов сделать это - использовать ключ, представляющий собой номер заказа и категорию продукта, чтобы дублирующие категории для разных заказов обрабатывались по-разному

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

В выходных данных нет разрывов строк или пробелов, но я надеюсь, что это даст вам общее представление.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...