2013-11-28 2 views
0

Я работаю с XSLT1.0. Мое требование состоит в объединении набора элементов на основе общего атрибута. я в XML-который выглядит следующим образом:Объединение набора элементов на основе общего атрибута в XSLT 1.0

<?xml version="1.0" encoding="utf-8"?> 
<Catalog> 
    <product> 
     <productId>S100</productId> 
     <name>RNKC</name> 
     <category>books</category> 
    </product> 
    <product> 
     <productId>S100</productId> 
     <name>RNKC</name> 
     <category>CD</category> 
    </product> 
    <product> 
     <productId>S200</productId> 
     <name>ISDR</name> 
     <category>eBook</category> 
    </product> 
    <product> 
     <productId>S200</productId> 
     <name>ISDR</name> 
     <category>books</category> 
    </product> 
</Catalog> 

Я хочу выходной XML, как показано ниже

<?xml version="1.0" encoding="utf-8"?> 
<Catalog> 
    <product> 
     <productId>S100</productId> 
     <name>RNKC</name> 
     <category>books,CD</category> 
    </product> 
    <product> 
     <productId>S200</productId> 
     <name>RNKC</name> 
     <category>eBook,books</category> 
    </product> 
</Catalog> 

попытался использовать, но не смог добиться правильного вывода. Pls сообщит мне, возможно ли такое преобразование и как это можно сделать. Цените свою помощь!

+1

http://stackoverflow.com/questions/1903906/xslt-1-0-group-by похоже похоже. – halfbit

+1

Незначительная точка дизайна, но я бы не связывал значения в один элемент, подобный этому. Вам гораздо лучше иметь несколько элементов 'category', предпочтительно с элементом parent' categories'. Это упростит дальнейшую обработку/запрос, если вам по какой-то причине они будут разделены запятыми, это можно сделать в том месте, где используются данные. – Flynn1179

+0

@halfbit - Спасибо, что указал мне на группу Muenchian! – user1954182

ответ

0

Как показано в другом разделе, связанном с половиной, вам нужно использовать ключ, чтобы (1) выбрать отдельные продукты (а также метод Muenchian) и (2) собрать значения из связанной группы.

Вот немного более читаемым (ИМХО) версия:

<?xml version="1.0" encoding="UTF-8"?> 
<xsl:stylesheet version="1.0" 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 

<xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes" /> 

<xsl:key name="sameProduct" match="product" use="productId" /> 

<xsl:template match="/"> 

<!-- SELECT ONLY THE FIRST PRODUCT IN EACH GROUP --> 
<xsl:for-each select="Catalog/product[generate-id() = generate-id(key('sameProduct', productId)[1])]"> 
<product> 
    <productId><xsl:value-of select="productId"/></productId> 
    <name><xsl:value-of select="name"/></name> 
    <category> 
     <!-- GET THE VALUES FROM ALL MEMBERS OF THE GROUP --> 
     <xsl:for-each select="key('sameProduct', productId)"> 
      <xsl:value-of select="category"/> 
      <xsl:if test="position() != last()"> 
       <xsl:text>,</xsl:text> 
      </xsl:if> 
     </xsl:for-each> 
    </category> 
</product> 
</xsl:for-each> 

</xsl:template> 
</xsl:stylesheet> 

Если ваш процессор способен EXSLT, вы можете использовать набор: определенную функцию() вместо Muenchian группировки.

+0

Спасибо, этот пример был очень полезен! Наряду с объяснением группировки Muenchian здесь http://www.jenitennison.com/xslt/grouping/muenchian.html – user1954182

Смежные вопросы