2012-04-20 38 views
1

这里XML数据是XML我想使用XSL转换到下面的结果。任何帮助please.This有点像Windows目录结构。这里的目录深度是动态的。分组使用XSL

<?xml version="1.0" encoding="UTF-8"?> 
<root> 
<qc name="accounting" level="1"> 
    <qc name="fund" level="2"> 
     <qc name="v1_0" level="3"/> 
    </qc> 
</qc> 
<qc name="asset_allocation" level="1"> 
    <qc name="fund" level="2"> 
     <qc name="v1_0" level="3"/> 
    </qc> 
</qc> 
<qc name="asset_allocation" level="1"> 
    <qc name="fund" level="2"> 
     <qc name="v1_1" level="3"/> 
    </qc> 
</qc> 
<qc name="credit_quality" level="1"> 
    <qc name="account" level="2"> 
     <qc name="v1_0" level="3"/> 
    </qc> 
</qc> 
<qc name="credit_quality" level="1"> 
    <qc name="fund" level="2"> 
     <qc name="v1_0" level="3"/> 
    </qc> 
</qc> 
<qc name="credit_quality" level="1"> 
    <qc name="v1_0" level="2"/> 
</qc> 
<qc name="credit_quality" level="1"> 
    <qc name="v2_0" level="2"/> 
</qc> 
<qc name="portfolio" level="1"> 
    <qc name="credit_quality" level="2"> 
     <qc name="v1_0" level="3"/> 
    </qc> 
</qc> 
</root> 

在上面的XML我有每个级别的名称。我想在相同的级别分组相同的名称。

结果:

<root> 
<qc name="accounting" level="1"> 
    <qc name="fund" level="2"> 
     <qc name="v1_0" level="3"/> 
    </qc> 
</qc> 
<qc name="asset_allocation" level="1"> 
    <qc name="fund" level="2"> 
     <qc name="v1_0" level="3"/> 
     <qc name="v1_1" level="3"/> 
    </qc> 
</qc> 
<qc name="credit_quality" level="1"> 
    <qc name="account" level="2"> 
     <qc name="v1_0" level="3"/> 
    </qc> 
    <qc name="fund" level="2"> 
     <qc name="v1_0" level="3"/> 
    </qc> 
    <qc name="v1_0" level="2"/> 
    <qc name="v2_0" level="2"/> 
</qc> 
<qc name="portfolio" level="1"> 
    <qc name="credit_quality" level="2"> 
     <qc name="v1_0" level="3"/> 
    </qc> 
</qc> 
</root> 
+0

那么,就是你有这么远的XSL? – Torious 2012-04-20 21:58:38

回答

2

如果你可以使用XSLT 2.0,做,并且使用的xsl:for-各组指令。

如果你被卡住XSLT 1.0,阅读了有关Muenchian分组的。

1

使用XSLT 1.0和EXSLT函数可能看起来像一个快速的黑客攻击。这可能不是最优雅的解决方案,但它应该起作用。

<?xml version="1.0" encoding="utf-8"?> 
<xsl:stylesheet version="1.0" 
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
    xmlns:func="http://exslt.org/functions" 
    xmlns:my="my-namespace" 
    extension-element-prefixes="func" 
    exclude-result-prefixes="my"> 

    <xsl:key name="qc-by-path" match="qc" use="my:path(.)"/> 

    <xsl:template match="root"> 
    <root> 
     <xsl:apply-templates/> 
    </root> 
    </xsl:template> 

    <xsl:template match="qc"> 
    <xsl:variable name="peers" select="key('qc-by-path', my:path(.))"/> 
    <xsl:if test="generate-id(.)=generate-id($peers[1])"> 
     <qc name="{@name}" level="{@level}"> 
     <xsl:apply-templates select="$peers/qc"/> 
     </qc> 
    </xsl:if> 
    </xsl:template> 

    <func:function name="my:path"> 
    <xsl:param name="qc"/> 
    <xsl:choose> 
     <xsl:when test="$qc/parent::qc"> 
     <func:result select="concat(my:path($qc/parent::qc),'/',$qc/@name)"/> 
     </xsl:when> 
     <xsl:otherwise> 
     <func:result select="$qc/@name"/> 
     </xsl:otherwise> 
    </xsl:choose> 
    </func:function> 
</xsl:stylesheet>