2013-05-07 87 views
1


我需要使用一些xslt,我不知道從哪裏開始,希望你們至少能給我一些線索。

源XML
把元素標識爲一個節點

<ROW> 
    <DEPT> A </DEPT> 
</ROW> 
<ROW> 
    <DEPT> B </DEPT> 
</ROW> 
<ROW> 
    <DEPT> A </DEPT> 
</ROW> 

目標XML

<DEPTARTMENT> 
    <ROW> 
     <DEPT> A </DEPT> 
    </ROW> 
    <ROW> 
     <DEPT> A </DEPT> 
    </ROW> 
</DEPARTMENT> 
<DEPTARTMENT> 
    <ROW> 
     <DEPT> B </DEPT> 
    </ROW> 
</DEPARTMENT> 

感謝您的任何意見。

回答

3

這是一個可能的XSLT 1.0解決方案。

當該XSLT:

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

    <xsl:key name="kRowByDept" match="ROW" use="DEPT"/> 

    <xsl:template match="/*"> 
    <T> 
     <xsl:apply-templates 
     select="ROW[generate-id() = generate-id(key('kRowByDept', DEPT)[1])]"/> 
    </T> 
    </xsl:template> 

    <xsl:template match="ROW"> 
    <DEPARTMENT> 
     <xsl:copy-of select="key('kRowByDept', DEPT)"/> 
    </DEPARTMENT> 
    </xsl:template> 
</xsl:stylesheet> 

...被施加在提供的XML(包裝在一個頂級元素,使良好的形成的文件):

<T> 
    <ROW> 
    <DEPT> A </DEPT> 
    </ROW> 
    <ROW> 
    <DEPT> B </DEPT> 
    </ROW> 
    <ROW> 
    <DEPT> A </DEPT> 
    </ROW> 
</T> 

...產生期望的解決方案:

<T> 
    <DEPARTMENT> 
    <ROW> 
     <DEPT> A </DEPT> 
    </ROW> 
    <ROW> 
     <DEPT> A </DEPT> 
    </ROW> 
    </DEPARTMENT> 
    <DEPARTMENT> 
    <ROW> 
     <DEPT> B </DEPT> 
    </ROW> 
    </DEPARTMENT> 
</T> 

說明:

這是使用Muenchian Grouping,用於分組元件一起的XSLT 1.0特定方法的解決方案。


這裏是一個類似的XSLT 2.0解決方案;注意這是更直接。

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

    <xsl:template match="/*"> 
    <T> 
     <xsl:for-each-group select="ROW" group-by="DEPT"> 
     <DEPARTMENT> 
      <xsl:copy-of select="current-group()" /> 
     </DEPARTMENT> 
     </xsl:for-each-group> 
    </T> 
    </xsl:template> 

</xsl:stylesheet> 
+0

想不到更完整的答案,非常感謝! – Jandrejc 2013-05-09 08:43:02