2017-07-25 51 views
0

我從以下格式中的一個系統獲取XML。我需要轉換XML。需要將XSLT 1.0中的唯一代碼轉換爲XML

<parentTag> 
    <childTag> 
     <date>28-Jan-2017</date> 
     <code>DoB</code> 
     <oldStatus>g</oldStatus> 
     <newStatus>22</newStatus> 
    </childTag> 

    <childTag> 
     <date>27-Jan-2017</date> 
     <code>www</code> 
     <oldStatus>25</oldStatus> 
     <newStatus>g</newStatus> 
    </childTag> 

    <childTag> 
     <date>26-Jan-2017</date> 
     <code>DoB</code> 
     <oldStatus>56</oldStatus> 
     <newStatus>73</newStatus> 
    </childTag> 

    <childTag> 
     <date>26-Jan-2017</date> 
     <code>www</code> 
     <oldStatus>66</oldStatus> 
     <newStatus>55</newStatus> 
    </childTag> 
</parentTag> 

我需要收集每個代碼的所有細節,並使用XSLT 1.0如下所示轉換XML。

<parentTag> 
    <childTag> 
     <code>DoB</code> 
     <status> 
      <date>28-Jan-2017</date> 
      <oldStatus>g</oldStatus> 
      <newStatus>22</newStatus> 
     </status> 
     <status> 
      <date>26-Jan-2017</date> 
      <oldStatus>56</oldStatus> 
      <newStatus>73</newStatus> 
     </status> 
    </childTag> 

    <childTag> 
     <code>www</code> 
     <status> 
      <date>27-Jan-2017</date> 
      <oldStatus>25</oldStatus> 
      <newStatus>g</newStatus> 
     </status> 
     <status> 
      <date>26-Jan-2017</date> 
      <oldStatus>66</oldStatus> 
      <newStatus>55</newStatus> 
     </status> 
    </childTag> 
</parentTag> 

我請求你幫忙。

謝謝。

+0

[通過調用模板XSLT分組]的可能的複製(https://stackoverflow.com/questions/15132763/xslt-grouping-by-calling - 模板) – ophychius

+0

類似的問題已被問及很多次。你嘗試過搜索嗎? – ophychius

回答

1

可以在XSLT使用Muenchian分組的1.0

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


    <xsl:key name="keycode" match="childTag" use="code"/> 

    <xsl:template match="parentTag"> 
     <xsl:copy> 
     <xsl:for-each select="childTag[generate-id() = generate-id(key('keycode', code)[1])]"> 
     <childTag> 
      <xsl:copy-of select="code"/> 
      <xsl:variable name="currentcode" select="normalize-space(code)"/> 
      <xsl:for-each select="key('keycode', $currentcode)"> 
       <status> 
        <xsl:copy-of select="date|oldStatus|newStatus"/> 
       </status> 
      </xsl:for-each> 
     </childTag> 
     </xsl:for-each>    
     </xsl:copy> 
    </xsl:template> 

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

謝謝你的回答。 –