2015-05-09 3 views
1

Я использую XSLT 1.0 и пытаюсь сгруппировать по два элемента в моем XML. В основном я хотел бы преобразовать следующий XML:XSLT Группирование нескольких ключей

<requirements> 
    <item> 
    <category>Admin</category> 
    <functionality>View Data</functionality> 
    <requirement>The system shall do 1</requirement> 
    </item> 
    <item> 
    <category>Admin</category> 
    <functionality>View Data</functionality> 
    <requirement>The system shall do 2</requirement> 
    </item> 
    <item> 
    <category>Admin</category> 
    <functionality>Query Data</functionality> 
    <requirement>The system shall do 3</requirement> 
    </item> 
    <item> 
    <category>Admin</category> 
    <functionality>Query Data</functionality> 
    <requirement>The system shall do 4</requirement> 
    </item> 
</requirements> 

в этом:

<requirements> 
    <item> 
    <category>Admin</category> 
    <functionality>View Data</functionality> 
    <requirement id ="1">The system shall do 1</requirement> 
    <requirement id ="2">The system shall do 2</requirement> 
    </item> 
    <item> 
    <category>Admin</category> 
    <functionality>Query Data</functionality> 
    <requirement id="1">The system shall do 3</requirement> 
    <requirement id="2">The system shall do 4</requirement> 
    </item> 
</requirements> 

Я просто не имеют достаточного опыта работы с XSLT еще правильно реализовать Muenchian метод.

Любая помощь очень ценится.

+0

Можете ли вы объяснить логику? Я мог подумать, что вы пытаетесь группировать «элементы» с помощью «функциональности», а '@ id' на' требовании' имеет значение 'n' для« n-го требования ». Пожалуйста, не стесняйтесь публиковать свои предложения здесь. –

+0

"* пытается сгруппировать по два элемента *" Какие два? –

+0

@ Lingamurthy CS - Ваше объяснение на месте. Наверное, я действительно не мог представить, что мне действительно нужно. – Tony

ответ

0

Если вы используете ключ, который сцепляет category и functionality, как в <xsl:key name="group" match="item" use="concat(category, '|', functionality)"/>, то вы можете использовать обычную Muenchian группировку:

<xsl:stylesheet 
    version="1.0" 
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 

<xsl:output indent="yes"/> 

<xsl:key name="group" match="item" use="concat(category, '|', functionality)"/> 

<xsl:template match="requirements"> 
    <xsl:copy> 
    <xsl:apply-templates select="item[generate-id() = generate-id(key('group', concat(category, '|', functionality))[1])]"/> 
    </xsl:copy> 
</xsl:template> 

<xsl:template match="item"> 
    <xsl:copy> 
    <xsl:copy-of select="category | functionality"/> 
    <xsl:apply-templates select="key('group', concat(category, '|', functionality))/requirement"/> 
    </xsl:copy> 
</xsl:template> 

<xsl:template match="requirement"> 
    <xsl:copy> 
    <xsl:attribute name="id"><xsl:value-of select="position()"/></xsl:attribute> 
    <xsl:apply-templates/> 
    </xsl:copy> 
</xsl:template> 

</xsl:stylesheet> 
+0

Это прекрасно работает. Спасибо за ваш вклад. – Tony

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