2011-01-11 60 views
0

执行多个群组任何人都可以使用XSLT对多个群组进行帮助。 我想通过ORG按财年季度(QTR2)对以下XML数据进行分组,并以特定格式输出。XSLT版本1.0如何通过

这里是XML:

<NewDataSet> 
<Data> 
    <ORG>00A</ORG> 
    <TASK_COUNT>11</TASK_COUNT> 
    <FY>10</FY> 
    <QTR>1st QTR-FY10</QTR> 
    <QTR2>FY10 1st QTR <br>(1 OCT - 31 DEC)</QTR2> 
    </Data> 
<Data> 
    <ORG>00C</ORG> 
    <TASK_COUNT>2</TASK_COUNT> 
    <FY>10</FY> 
    <QTR>1st QTR-FY10</QTR> 
    <QTR2>FY10 1st QTR <br>(1 OCT - 31 DEC)</QTR2> 
    </Data> 
<Data> 
    <ORG>00T</ORG> 
    <TASK_COUNT>11</TASK_COUNT> 
    <FY>10</FY> 
    <QTR>1st QTR-FY10</QTR> 
    <QTR2>FY10 1st QTR <br>(1 OCT - 31 DEC)</QTR2> 
    </Data> 
<Data> 
    <ORG>00</ORG> 
    <TASK_COUNT>2</TASK_COUNT> 
    <FY>10</FY> 
    <QTR>2nd QTR-FY10</QTR> 
    <QTR2>FY10 2nd QTR <br>(1 JAN - 31 MAR)</QTR2> 
    </Data> 
<Data> 
    <ORG>00A</ORG> 
    <TASK_COUNT>13</TASK_COUNT> 
    <FY>10</FY> 
    <QTR>2nd QTR-FY10</QTR> 
    <QTR2>FY10 2nd QTR <br>(1 JAN - 31 MAR)</QTR2> 
    </Data> 
<Data> 
    <ORG>00B</ORG> 
    <TASK_COUNT>4</TASK_COUNT> 
    <FY>10</FY> 
    <QTR>2nd QTR-FY10</QTR> 
    <QTR2>FY10 2nd QTR <br>(1 JAN - 31 MAR)</QTR2> 
    </Data> 
    ... 

输出应该是这个样子:

<data> 
<series name="00A"> 
    <point name="QTR1&lt;br&gt;FY10" y="11"/> 
    <point name="QTR2&lt;br&gt;FY10" y="13"/> 
    <point name="QTR4&lt;br&gt;FY10" y="50"/> 
    <point name="QTR1&lt;br&gt;FY11" y="9"/> 
    <point name="QTR2&lt;br&gt;FY11" y="1"/> 
</series> 
<series name="00B"> 
    <point name="QTR1&lt;br&gt;FY10" y="10"/> 
    <point name="QTR2&lt;br&gt;FY10" y="4"/> 
    <point name="QTR3&lt;br&gt;FY10" y="7"/> 
    <point name="QTR1&lt;br&gt;FY11" y="9"/> 
    <point name="QTR2&lt;br&gt;FY11" y="2"/> 
</series> 
<series name="00C"> 
    <point name="QTR1&lt;br&gt;FY10" y="7"/> 
    <point name="QTR2&lt;br&gt;FY10" y="21"/> 
    <point name="QTR3&lt;br&gt;FY10" y="4"/> 
    <point name="QTR4&lt;br&gt;FY10" y="5"/> 
    <point name="QTR1&lt;br&gt;FY11" y="11"/> 
    <point name="QTR2&lt;br&gt;FY11" y="13"/> 
</series> 
<series name="00T"> 
    <point name="QTR1&lt;br&gt;FY10" y="14"/> 
    <point name="QTR2&lt;br&gt;FY10" y="17"/> 
    <point name="QTR3&lt;br&gt;FY10" y="20"/> 
    <point name="QTR4&lt;br&gt;FY10" y="5"/> 
    <point name="QTR2&lt;br&gt;FY11" y="18"/> 
</series> 
<series name="00"> 
    <point name="QTR1&lt;br&gt;FY10" y="2"/> 
    <point name="QTR2&lt;br&gt;FY10" y="19"/> 
    <point name="QTR3&lt;br&gt;FY10" y="6"/> 
    <point name="QTR4&lt;br&gt;FY10" y="13"/> 
    <point name="QTR1&lt;br&gt;FY11" y="11"/> 
</series> 
</data> 

这里是XSLT:

<?xml version="1.0" encoding="utf-8" ?> 
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
<xsl:output method="xml" omit-xml-declaration="yes"/> 
<xsl:key name="byORG" match="Data" use="ORG"/> 
<xsl:key name="byORGbyQTR2" match="Data" use="concat(ORG, '|', QTR2)"/> 
<xsl:template match="/"> 
    <Data> 
    <xsl:apply-templates select="NewDataSet/Data[generate-id() = generate-id(key('byORG', ORG)[1])]"> 
    <xsl:sort select="ORG"/> 
    </xsl:apply-templates> 
    </Data> 
</xsl:template> 
<xsl:template match="Data"> 
    <xsl:apply-templates select="key('byORG', ORG)[generate-id() = generate-id(key('byORGbyQTR2', concat(ORG, '|', QTR2))[1])]" mode="qrt2"> 
    <xsl:sort select="QTR2"/> 
    </xsl:apply-templates> 
</xsl:template> 
</xsl:stylesheet> 

我也试过这样:

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
<xsl:output method="xml" /> 
<xsl:key match="Data" name="group-by-org" use="ORG"></xsl:key> 
<xsl:template match="/"> 
    <Data> 
    <xsl:for-each select="NewDataSet/Data[key('group-by-org', ORG)]"> 
    <series> 
    <xsl:attribute name="name"> 
     <xsl:value-of select="ORG"/> 
    </xsl:attribute> 
    <point> 
     <xsl:attribute name="name"> 
     <xsl:value-of select="QTR2"/> 
    </xsl:attribute> 
     <xsl:attribute name="y"> 
     <xsl:value-of select="TASK_COUNT"/> 
    </xsl:attribute> 
    </point> 
    </series> 
    </xsl:for-each> 
    </Data> 
</xsl:template> 
</xsl:stylesheet> 
+0

这个问题不适合提供所有必要的信息,以便一个有意义的答案将被生成。什么是@y?对于生成@name的价值有什么要求? – 2011-01-11 17:07:05

回答

2

我认为你没有组装拼在一起...... 按照自己的风格:

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
    <xsl:output method="xml" omit-xml-declaration="yes"/> 
    <xsl:key name="byORG" match="Data" use="ORG"/> 
    <xsl:key name="byORGbyQTR2" match="Data" use="concat(ORG, '|', QTR2)"/> 
    <xsl:template match="/"> 
     <Data> 
      <xsl:apply-templates 
       select="NewDataSet/Data[generate-id() = 
             generate-id(key('byORG', ORG)[1])]"> 
       <xsl:sort select="ORG"/> 
      </xsl:apply-templates> 
     </Data> 
    </xsl:template> 
    <xsl:template match="Data"> 
     <series name="{ORG}"> 
      <xsl:apply-templates 
       select="key('byORG', ORG) 
          [generate-id() = 
          generate-id(key('byORGbyQTR2', 
              concat(ORG, '|', QTR2))[1])]" 
       mode="qrt2"> 
       <xsl:sort select="QTR2"/> 
      </xsl:apply-templates> 
     </series> 
    </xsl:template> 
    <xsl:template match="Data" mode="qrt2"> 
     <point y="{TASK_COUNT}"> 
      <xsl:attribute name="name"> 
       <xsl:apply-templates select="QTR2"/> 
      </xsl:attribute> 
     </point> 
    </xsl:template> 
    <xsl:template match="br"> 
     <xsl:text>&lt;br/&gt;</xsl:text> 
    </xsl:template> 
</xsl:stylesheet> 

输出:

<Data> 
    <series name="00"> 
     <point y="2" name="FY10 2nd QTR&lt;br/&gt;(1 JAN - 31 MAR)"></point> 
    </series> 
    <series name="00A"> 
     <point y="11" name="FY10 1st QTR&lt;br/&gt;(1 OCT - 31 DEC)"></point> 
     <point y="13" name="FY10 2nd QTR&lt;br/&gt;(1 JAN - 31 MAR)"></point> 
    </series> 
    <series name="00B"> 
     <point y="4" name="FY10 2nd QTR&lt;br/&gt;(1 JAN - 31 MAR)"></point> 
    </series> 
    <series name="00C"> 
     <point y="2" name="FY10 1st QTR&lt;br/&gt;(1 OCT - 31 DEC)"></point> 
    </series> 
    <series name="00T"> 
     <point y="11" name="FY10 1st QTR&lt;br/&gt;(1 OCT - 31 DEC)"></point> 
    </series> 
</Data>