2016-04-05 7 views
1

XSLT'ye yeni geliyorum ve aşağıdaki sorunu çözmeye çalışıyorum. Ben yapmaya çalışıyorum neXSLT kullanarak Düz Hiyerarşi Toplaması

<?xml version="1.0" encoding="UTF-8"?> 
<Data> 
    <Entry> 
     <CName>CCXXX</CName> 
     <CCH_Summary>Marketing</CCH_Summary> 
     <CCH_Rollup_1>Marketing Group</CCH_Rollup_2> 
     <CCH_Rollup_2>Marketing (COR)</CCH_Rollup_2> 
     <CCH_Rollup_3>Cost of Revenue</CCH_Rollup_3> 
     <CCH_Rollup_4>Total Cost Centre</CCH_Rollup_4> 
    </Entry> 
    <Entry> 
     <CName>CCXXX</CName> 
     <CCH_Summary>Finance</CCH_Summary> 
     <CCH_Rollup_1>Finance Ret</CCH_Rollup_2> 
     <CCH_Rollup_2>Finance Acct (COR)</CCH_Rollup_2> 
     <CCH_Rollup_3>Cost of Revenue</CCH_Rollup_3> 
     <CCH_Rollup_4>Total Cost Centre</CCH_Rollup_4> 
    </Entry> 
</Data> 

CCH_Rollup_1 tüm ayrı değerleri almak ve ilgili kardeş CCH_Rollup_2 elde etmektir: Ben aşağıdaki XML dosyası var. Sonra tüm farklı CCH_Rollup_2 değerlerine ihtiyacım var ve kardeşlerini CCH_Rollup_3 aldım. Temel olarak - "hiyerarşi" ni 2 sütun halinde düzleştirin. Benim ilk yaklaşım farklı değer çiftleri(), ancak bu gerçekten beni pozisyonu olarak kardeş dönmesine izin vermez (kullanmaktı

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, 

): Ben bekliyorum

çıktı şudur sıfırlayın.

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

Her giriş için bir kimlik atama ve kardeş dönmek için bu kullanan güvenilir ikinci girişim yaklaşımı

. Ancak, hiçbir şey geri dönüyor gibi görünmüyor.

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

Neyi yanlış yapıyorum? Buna yaklaşmanın iyi bir yolu nedir?

+1

, bağlantıyı girişten tam olarak istediğiniz çıktıyı gösterebilir yapacağız! –

+0

Çıktıdaki sıraların sırası önemli mi? –

+0

Sipariş yalnızca farklı değerler olduğu sürece önemli değildir. – Yavor

cevap

1

Sipariş önemli değilse, distinct-values buradan yararlanabilirsiniz.

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

Aslında, burada xsl:for-each gerekmez bu şablonu deneyin. Sana vb sayesinde tam anlamıyla çıkış `aa`,` bb`, istemiyoruz tahmin ediyorum gibi bir tek 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> 
+0

Bu bir, Tim! Teşekkürler! – Yavor