2017-07-25 43 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

谢谢你的回答。 –