使用XSLT展平Hierachy Rollup

时间:2016-04-05 10:04:08

标签: xslt

我是XSLT的新手,我正在寻求解决以下问题。我有以下XML文件:

Marketing,Marketing Group
Marketing Group,Marketing (COR)
Marketing (COR), Cost of Revenue
Finance,Finance Ret
Finance Ret, Finance Acct
Finance Acct, Cost of Revenue
Cost of Revenue,Total Cost Centre    
Total Cost Centre,

我要做的是从CCH_Rollup_1获取所有不同的值并获取相应的兄弟CCH_Rollup_2。然后我需要所有不同的CCH_Rollup_2值并获得它们的兄弟CCH_Rollup_3,依此类推。基本上 - 将“层次结构”展平为2列。

我期待的输出是:

<xsl:variable name="rootnode" select="/"/>

    <xsl:template match="//Data">        
        <xsl:for-each select="distinct-values(//CCH_Rollup_1)">
            <xsl:value-of select="." />,<xsl:value-of select="$rootnode/Entry[position()]/CCH_Rollup_2" />
        </xsl:for-each>

我的第一种方法是使用distinct-values(),但这并不能让我在重置position()时返回兄弟。

<xsl:variable name="rootnode" select="/"/> 

<!-- build first column -->

<xsl:key name="CCH" match="//Data/Entry/CCH_Rollup[*]/text()" use="." />

<xsl:template match="/">

    <xsl:for-each select="//Data/Entry/text()[generate-id() = generate-id(key('CCH',.)[1])]">
            <xsl:value-of select="." />,<xsl:value-of select="$rootnode/Entry[position()]/CCH_Rollup_2" />
    </xsl:for-each>

</xsl:template>

我尝试的第二种尝试方法是为每个条目分配一个ID,并使用它来返回兄弟。但是,它似乎没有返回任何东西。

namespace:url-name

我做错了什么?有什么好方法可以解决这个问题?

1 个答案:

答案 0 :(得分:1)

如果订单不重要,您可以在此处使用distinct-values。试试这个模板

<xsl:template match="Data">        
    <xsl:for-each select="distinct-values(//Entry/*[not(self::CName)]/concat(., ',', following-sibling::*[1]))">
        <xsl:value-of select="." />
        <xsl:text>&#10;</xsl:text>
    </xsl:for-each>
</xsl:template>

事实上,你在这里不需要xsl:for-each。一个xsl:value-of会做

<xsl:template match="Data">        
    <xsl:value-of select="distinct-values(//Entry/*[not(self::CName)]/concat(., ',', following-sibling::*[1]))" separator="&#10;" />
</xsl:template>