我是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
我做错了什么?有什么好方法可以解决这个问题?
答案 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> </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=" " />
</xsl:template>