2013-11-27 108 views
1

我有以下簡單的XML結構:XSLT 1.0:將一個值分組到多個值 - 使用密鑰?

<?xml version="1.0" encoding="UTF-8" standalone="no"?> 
<DESADV> 
<M_DESADV> 
    <G_SG10> 
     <G_SG13> 
      <S_GIN> 
       <id>GIN</id> 
       <D_7405_6>BJ</D_7405_6> 
       <C_C208_2> 
        <D_7402_8>373500699550026556</D_7402_8> 
       </C_C208_2> 
      </S_GIN> 
     </G_SG13> 
    </G_SG10> 
    <G_SG10> 
     <G_SG17> 
      <S_PIA> 
       <id>PIA</id> 
       <D_4347>1</D_4347> 
       <C_C212_2> 
        <D_7140_2>110005</D_7140_2> 
        <D_7143_4>SA</D_7143_4> 
       </C_C212_2> 
      </S_PIA> 
     </G_SG17> 
    </G_SG10> 
    <G_SG10> 
     <G_SG17> 
      <S_PIA> 
       <id>PIA</id> 
       <D_4347>1</D_4347> 
       <C_C212_2> 
        <D_7140_2>123456</D_7140_2> 
        <D_7143_4>SA</D_7143_4> 
       </C_C212_2> 
      </S_PIA> 
     </G_SG17> 
    </G_SG10> 
    <G_SG10> 
     <G_SG13> 
      <S_GIN> 
       <id>GIN</id> 
       <D_7405_6>BJ</D_7405_6> 
       <C_C208_2> 
        <D_7402_8>3735009999999999</D_7402_8> 
       </C_C208_2> 
      </S_GIN> 
     </G_SG13> 
    </G_SG10> 
    <G_SG10> 
     <G_SG17> 
      <S_PIA> 
       <id>PIA</id> 
       <D_4347>1</D_4347> 
       <C_C212_2> 
        <D_7140_2>632154</D_7140_2> 
        <D_7143_4>SA</D_7143_4> 
       </C_C212_2> 
      </S_PIA> 
     </G_SG17> 
    </G_SG10> 
    <G_SG10> 
     <G_SG17> 
      <S_PIA> 
       <id>PIA</id> 
       <D_4347>1</D_4347> 
       <C_C212_2> 
        <D_7140_2>887796</D_7140_2> 
        <D_7143_4>SA</D_7143_4> 
       </C_C212_2> 
      </S_PIA> 
     </G_SG17> 
    </G_SG10> 
</M_DESADV> 
</DESADV> 

我需要做的映射,所以我得到了以下XML輸出:

<?xml version="1.0" encoding="UTF-8"?> 
<list> 
<number>373500699550026556 110005</number> 
<number>373500699550026556 123456</number> 
<number>3735009999999999 632154</number> 
<number>3735009999999999 887796</number> 
</list> 

我有麻煩的是,雖然輸出。我有以下XSLT,我雖然會工作:

<?xml version="1.0" encoding="UTF-8"?> 
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
version="1.0"> 

<xsl:template match="text()"/> 

<xsl:template match="/"> 
    <list> 
    <xsl:apply-templates/> 
    </list> 
</xsl:template> 

<xsl:template match="M_DESADV"> 

    <xsl:for-each select="G_SG10/G_SG17/S_PIA/C_C212_2[D_7143_4='SA']/D_7140_2"> 
     <number> 
      <xsl:value-of select="concat(
       parent::C_C212_2/parent::S_PIA/parent::G_SG17/parent::G_SG10/parent::M_DESADV 
       /G_SG10/G_SG13/S_GIN[D_7405_6='BJ']/C_C208_2/D_7402_8,' ', 
       .) 
       "/> 
     </number> 
    </xsl:for-each> 
</xsl:template> 



</xsl:stylesheet> 

但我的輸出看起來像這樣這不是我所期望:

<?xml version="1.0" encoding="UTF-8"?> 
<list> 
<number>373500699550026556 110005</number> 
<number>373500699550026556 123456</number> 
<number>373500699550026556 632154</number> 
<number>373500699550026556 887796</number> 
</list> 

可以這樣用Muenchian分組的解決了嗎?我嘗試設置密鑰,但它選擇 「D_7402_8」或僅「D_7140_2」。

有人可以告訴我如何解決這個問題嗎? 謝謝你,最好的問候, 彼得

回答

1

我不認爲你需要爲這個鍵,你只需要找到,每個G_SG10 - 即,具有-A- G_SG17,其最近的前一個兄弟G_SG10 -that-有-A- G_SG13

<xsl:for-each select="G_SG10/G_SG17/S_PIA/C_C212_2[D_7143_4='SA']/D_7140_2"> 
    <number> 
     <xsl:value-of select="concat(
      ancestor::G_SG10/preceding-sibling::G_SG10[G_SG13][1] 
      /G_SG13/S_GIN[D_7405_6='BJ']/C_C208_2/D_7402_8,' ', 
      .) 
      "/> 
    </number> 
</xsl:for-each> 

如果你真正的XML病情複雜得多,「有一個G_SG13」,那麼你只需要編碼相關條件的第一個謂詞的preceding-sibling::一步,如

preceding-sibling::G_SG10[G_SG13/S_GIN/D_7405_6='BJ'][1] 
+0

你好伊恩,非常感謝。它運作良好。我以前從未與「祖先::」合作過。使用它我可以避免所有的「parent ::」 - 是嗎?再次感謝你,彼得 – Peter

+0

你好伊恩,我其實有一個SG_11之間,所以我改變了路徑爲「祖先:: G_SG10 /之前的兄弟姐妹:: G_SG10 [G_SG11/G_SG13] [1]」完美的作品! :-) +1 – Peter

+0

@Peter是的,祖先軸以這種順序查看你的父母,祖父母等等(較小的數字表示「較近的」祖先)。在檢查'..'前,如果你想用'.'開始搜索,還有'ancestor-or-self ::'。 –