2012-04-20 71 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>