2012-10-01 57 views
1

我最近一直在使用XSLT,但現在我遇到了一個新問題,試圖對一個新的xml文件進行分組。我無法弄清楚如何將分組的範圍。我想在每個<Info>節點內將<Detail>分組。簡單的示例文件:XSLT爲每個兄弟分組的子節點

<?xml version="1.0" encoding="utf-8"?> 
<File> 
    <Info> 
    <Id>1111</Id> 
    <Detail type="A" group="1" > 
    <Data> 
     <Nr>1</Nr> 
    </Data> 
    <Data> 
     <Nr>2</Nr> 
    </Data> 
    </Detail> 
    <Detail type="B" group="1"> 
    <Data> 
     <Nr>3</Nr> 
    </Data> 
    <Data> 
     <Nr>4</Nr> 
    </Data> 
    </Detail> 
    <Detail type="B" group="2"> 
    <Data> 
     <Nr>5</Nr> 
    </Data> 
    </Detail> 
    <Detail type="A" group="1"> 
    <Data> 
     <Nr>6</Nr> 
    </Data> 
    </Detail> 
</Info> 
<Info> 
    <Id>2222</Id> 
    <Detail type="A" group="1" > 
     <Data> 
     <Nr>1</Nr> 
     </Data> 
    </Detail> 
    <Detail type="B" group="1"> 
     <Data> 
     <Nr>2</Nr> 
     </Data> 
    </Detail> 
    <Detail type="A" group="1"> 
     <Data> 
     <Nr>3</Nr> 
     </Data> 
    </Detail> 
    </Info> 
</File> 

輸出應該

<?xml version="1.0" encoding="utf-8"?> 
<File> 
    <Info> 
    <Id>1111</Id> 
    <Detail type="A" group="1" > 
    <Data> 
     <Nr>1</Nr> 
    </Data> 
    <Data> 
     <Nr>2</Nr> 
    </Data> 
     <Data> 
     <Nr>6</Nr> 
    </Data> 
    </Detail> 
    <Detail type="B" group="1"> 
    <Data> 
     <Nr>3</Nr> 
    </Data> 
    <Data> 
     <Nr>4</Nr> 
    </Data> 
    </Detail> 
    <Detail type="B" group="2"> 
    <Data> 
     <Nr>5</Nr> 
    </Data> 
    </Detail> 
</Info> 
<Info> 
    <Id>2222</Id> 
    <Detail type="A" group="1" > 
     <Data> 
     <Nr>1</Nr> 
     </Data> 
      <Data> 
     <Nr>3</Nr> 
     </Data> 
    </Detail> 
    <Detail type="B" group="1"> 
     <Data> 
     <Nr>2</Nr> 
     </Data> 
    </Detail> 
    </Info> 
</File> 

在我試試,我不知道如何將值從<Info>複製元素(ID,也可能是其他元素太)我只寫了<Info>元素,並且每個<Detail>都被分組到第一個<Info>元素中,而最後的<Info>元素爲空。

這裏是我的XSLT到目前爲止

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

    <xsl:key name="details" match="Detail" 
      use="concat(@type,'_',@group)"/> 
    <xsl:template match='/'> 
    <File> 
     <xsl:for-each select="File/Info"> 
     <Info> 
     <xsl:for-each select="Detail[count(. | key('details', concat(@type,'_',@group))[1]) = 1]"> 
     <xsl:sort select="concat(@type,'_',@group)" /> 
     <Detail type="{@type}" group="{@group}"> 
      <xsl:for-each select="key('details', concat(@type,'_',@group))"> 
      <xsl:copy-of select="Data"/> 
      </xsl:for-each> 
     </Detail> 
     </xsl:for-each> 
     </Info> 
     </xsl:for-each> 
    </File> 
    </xsl:template> 
</xsl:stylesheet> 

,這裏是我的結果,到目前爲止

<File> 
    <Info> 
    <Detail type="A" group="1"> 
     <Data> 
     <Nr>1</Nr> 
     </Data> 
     <Data> 
     <Nr>2</Nr> 
     </Data> 
     <Data> 
     <Nr>6</Nr> 
     </Data> 
     <Data> 
     <Nr>1</Nr> 
     </Data> 
     <Data> 
     <Nr>3</Nr> 
     </Data> 
    </Detail> 
    <Detail type="B" group="1"> 
     <Data> 
     <Nr>3</Nr> 
     </Data> 
     <Data> 
     <Nr>4</Nr> 
     </Data> 
     <Data> 
     <Nr>2</Nr> 
     </Data> 
    </Detail> 
    <Detail type="B" group="2"> 
     <Data> 
     <Nr>5</Nr> 
     </Data> 
    </Detail> 
    </Info> 
    <Info /> 
</File> 

感謝所有幫助:)

回答

0

這種轉變

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
<xsl:output omit-xml-declaration="yes" indent="yes"/> 
<xsl:strip-space elements="*"/> 

<xsl:key name="kDetailChildren" match="Detail" 
    use="concat(generate-id(..),'+',@type,'+',@group)"/> 

<xsl:template match="node()|@*"> 
    <xsl:copy> 
     <xsl:apply-templates select="node()|@*"/> 
    </xsl:copy> 
</xsl:template> 

<xsl:template match= 
"Detail 
    [not(generate-id() 
     = 
     generate-id(key('kDetailChildren', 
         concat(generate-id(..),'+',@type,'+',@group) 
         )[1]) 
     )]"/> 
<xsl:template match="Detail"> 
    <Detail> 
    <xsl:apply-templates select="@*"/> 
    <xsl:apply-templates select= 
    "key('kDetailChildren', 
     concat(generate-id(..),'+',@type,'+',@group) 
     )/node()"/> 
    </Detail> 
</xsl:template> 
</xsl:stylesheet> 

當所提供的XML文檔應用:

<File> 
    <Info> 
     <Id>1111</Id> 
     <Detail type="A" group="1" > 
      <Data> 
       <Nr>1</Nr> 
      </Data> 
      <Data> 
       <Nr>2</Nr> 
      </Data> 
     </Detail> 
     <Detail type="B" group="1"> 
      <Data> 
       <Nr>3</Nr> 
      </Data> 
      <Data> 
       <Nr>4</Nr> 
      </Data> 
     </Detail> 
     <Detail type="B" group="2"> 
      <Data> 
       <Nr>5</Nr> 
      </Data> 
     </Detail> 
     <Detail type="A" group="1"> 
      <Data> 
       <Nr>6</Nr> 
      </Data> 
     </Detail> 
    </Info> 
    <Info> 
     <Id>2222</Id> 
     <Detail type="A" group="1" > 
      <Data> 
       <Nr>1</Nr> 
      </Data> 
     </Detail> 
     <Detail type="B" group="1"> 
      <Data> 
       <Nr>2</Nr> 
      </Data> 
     </Detail> 
     <Detail type="A" group="1"> 
      <Data> 
       <Nr>3</Nr> 
      </Data> 
     </Detail> 
    </Info> 
</File> 

產生想要的,正確的結果:

<File> 
    <Info> 
     <Id>1111</Id> 
     <Detail type="A" group="1"> 
     <Data> 
      <Nr>1</Nr> 
     </Data> 
     <Data> 
      <Nr>2</Nr> 
     </Data> 
     <Data> 
      <Nr>6</Nr> 
     </Data> 
     </Detail> 
     <Detail type="B" group="1"> 
     <Data> 
      <Nr>3</Nr> 
     </Data> 
     <Data> 
      <Nr>4</Nr> 
     </Data> 
     </Detail> 
     <Detail type="B" group="2"> 
     <Data> 
      <Nr>5</Nr> 
     </Data> 
     </Detail> 
    </Info> 
    <Info> 
     <Id>2222</Id> 
     <Detail type="A" group="1"> 
     <Data> 
      <Nr>1</Nr> 
     </Data> 
     <Data> 
      <Nr>3</Nr> 
     </Data> 
     </Detail> 
     <Detail type="B" group="1"> 
     <Data> 
      <Nr>2</Nr> 
     </Data> 
     </Detail> 
    </Info> 
</File> 

說明

  1. 正確使用的身份規則Muenchian使用複合鍵的分組方法。

  2. 請注意父母的身份是如何包含在密鑰中的。

+0

感謝您的一個很好的答案,它可以很好地重用真正的格式。我現在用一些時間來理解流程。 – user1663498

+0

@ user1663498,不客氣。 –

相關問題