2012-04-20 13 views
1

ここはxml xslを使用して以下の結果に変換します。任意の助けてください。これはWindowsのディレクトリ構造のようなものです。ディレクトリの深さは動的です。xslを使用したxmlデータのグループ化

<?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

答えて

2

あなたは、XSLT 2.0を使用して行う、とXSLを使用することができます場合は、次のために、各グループの命令。

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> 
関連する問題