2011-01-09 85 views
2

我想写入xslt来获取输入xml的响应。提前致谢。我想将产出分组,以便每个员工详细信息不重复月份组合。按月份和年份组合的组响应

输入XML:

<resultset> 
    <row> 
     <column> 
      <name>Month</name> 
      <value>2</value> 
     </column> 
     <column> 
      <name>Year</name> 
      <value>2010</value> 
     </column> 
     <column> 
      <name>EmpName</name> 
      <value>Anu</value> 
     </column> 
     <column> 
      <name>Age</name> 
      <value>24</value> 
     </column> 
    </row> 
    <row> 
     <column> 
      <name>Month</name> 
      <value>2</value> 
     </column> 
     <column> 
      <name>Year</name> 
      <value>2010</value> 
     </column> 
     <column> 
      <name>EmpName</name> 
      <value>Nancy</value> 
     </column> 
     <column> 
      <name>Age</name> 
      <value>26</value> 
     </column> 
    </row> 
    <row> 
     <column> 
      <name>Month</name> 
      <value>3</value> 
     </column> 
     <column> 
      <name>Year</name> 
      <value>2010</value> 
     </column> 
     <column> 
      <name>EmpName</name> 
      <value>Ned</value> 
     </column> 
     <column> 
      <name>Age</name> 
      <value>25</value> 
     </column> 
    </row> 
</resultset> 

输出预计:

<Response> 
    <PeriodInfo> 
     <Month>2</Month> 
     <Year>2010</Year> 
     <EmployeeDetails> 
      <Name>Anu</Name> 
      <Age>24</Age> 
     </EmployeeDetails> 
     <EmployeeDetails> 
      <Name>Nancy</Name> 
      <Age>26</Age> 
     </EmployeeDetails> 
    </PeriodInfo> 
    <PeriodInfo> 
     <Month>3</Month> 
     <Year>2010</Year> 
     <EmployeeDetails> 
      <Name>Ned</Name> 
      <Age>25</Age> 
     </EmployeeDetails> 
    </PeriodInfo> 
</Response> 

回答

2

定义键 “行到月”,其按年份和月份索引行。

然后使用Muenchian分组在输入中选择唯一的年份组合。 “行”模板每个应用一次。

要生成“EmployeeDetails”输出,请使用key()选择年份与当前摘要行相同的所有行。

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 

    <xsl:output method="xml" indent="yes" /> 

    <xsl:key name="row-by-month" match="row" 
      use="concat(column[name='Year']/value,'-', 
         column[name='Month']/value)" /> 

    <xsl:template match="resultset"> 
     <Response> 
      <xsl:apply-templates 
       select="row[generate-id(.) = 
          generate-id(key('row-by-month', 
              concat(column 
                 [name='Year'] 
                 /value, 
                '-', 
                column 
                 [name='Month'] 
                 /value))[1])]"/> 
     </Response> 
    </xsl:template> 

    <xsl:template match="row"> 
     <PeriodInfo> 
      <Year> 
       <xsl:value-of select="column[name='Year']/value"/> 
      </Year> 
      <Month> 
       <xsl:value-of select="column[name='Month']/value"/> 
      </Month> 
      <xsl:apply-templates select="key('row-by-month', 
              concat(column 
                 [name='Year'] 
                 /value, 
                '-', 
                column 
                 [name='Month'] 
                 /value))" 
           mode="details"/> 
     </PeriodInfo> 
    </xsl:template> 

    <xsl:template match="row" mode="details"> 
     <EmployeeeDetails> 
      <Name> 
       <xsl:value-of select="column[name='EmpName']/value"/> 
      </Name> 
      <Age> 
       <xsl:value-of select="column[name='Age']/value"/> 
      </Age> 
     </EmployeeeDetails> 
    </xsl:template> 


</xsl:stylesheet> 
+0

+1好答案。 – 2011-01-09 22:59:16

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="kRowByDate" match="row" 
    use="concat(column[name='Year']/value, 
      '+', 
      column[name='Month']/value)"/> 

<xsl:template match="/*"> 
    <Response> 
    <xsl:apply-templates/> 
    </Response> 
</xsl:template> 

<xsl:template match= 
    "row[generate-id() 
     = 
     generate-id(key('kRowByDate', 
         concat(column[name='Year']/value, 
           '+', 
           column[name='Month']/value) 
         )[1] 
        ) 
     ] 
    "> 
    <xsl:variable name="vMonth" select="column[name='Month']/value"/> 
    <xsl:variable name="vYear" select="column[name='Year']/value"/> 
    <PeriodInfo> 
    <Month><xsl:value-of select="$vMonth"/></Month> 
    <Year><xsl:value-of select="$vYear"/></Year> 
    <xsl:apply-templates mode="data" 
     select="key('kRowByDate', concat($vYear,'+',$vMonth))"/> 
    </PeriodInfo> 
</xsl:template> 

<xsl:template match="row"/> 

<xsl:template match="row" mode="data"> 
    <EmployeeDetails> 
    <Name><xsl:value-of select="column[name='EmpName']/value"/></Name> 
    <Age><xsl:value-of select="column[name='Age']/value"/></Age> 
    </EmployeeDetails> 
</xsl:template> 
</xsl:stylesheet> 

当这个变换所提供的XML文档施加:

<resultset> 
    <row> 
     <column> 
      <name>Month</name> 
      <value>2</value> 
     </column> 
     <column> 
      <name>Year</name> 
      <value>2010</value> 
     </column> 
     <column> 
      <name>EmpName</name> 
      <value>Anu</value> 
     </column> 
     <column> 
      <name>Age</name> 
      <value>24</value> 
     </column> 
    </row> 
    <row> 
     <column> 
      <name>Month</name> 
      <value>2</value> 
     </column> 
     <column> 
      <name>Year</name> 
      <value>2010</value> 
     </column> 
     <column> 
      <name>EmpName</name> 
      <value>Nancy</value> 
     </column> 
     <column> 
      <name>Age</name> 
      <value>26</value> 
     </column> 
    </row> 
    <row> 
     <column> 
      <name>Month</name> 
      <value>3</value> 
     </column> 
     <column> 
      <name>Year</name> 
      <value>2010</value> 
     </column> 
     <column> 
      <name>EmpName</name> 
      <value>Ned</value> 
     </column> 
     <column> 
      <name>Age</name> 
      <value>25</value> 
     </column> 
    </row> 
</resultset> 

想要的,正确的结果产生

<Response> 
    <PeriodInfo> 
     <Month>2</Month> 
     <Year>2010</Year> 
     <EmployeeDetails> 
     <Name>Anu</Name> 
     <Age>24</Age> 
     </EmployeeDetails> 
     <EmployeeDetails> 
     <Name>Nancy</Name> 
     <Age>26</Age> 
     </EmployeeDetails> 
    </PeriodInfo> 
    <PeriodInfo> 
     <Month>3</Month> 
     <Year>2010</Year> 
     <EmployeeDetails> 
     <Name>Ned</Name> 
     <Age>25</Age> 
     </EmployeeDetails> 
    </PeriodInfo> 
</Response>