2015-05-09 80 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

你能解释背后的逻辑是什么?我能想到的是,你正在尝试用'functional'对'items'进行分组,'require'上的'@ id'对于'n要求'具有值'n'。请随时在此发布您的尝试。 –

+0

“*试图由两个元素分组*”哪两个? –

+0

@Lingamurthy CS - 你的解释是现货。我想我真的无法想象我真正需要的东西。 – Tony

回答

0

如果您使用的串接categoryfunctionality,在<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