开发者

XSLT group similar tags and associate to another tag value

<xml>
<TimeCal Cal ="1">
<DateUse DateUse="2010-08-30"/>
<DateUse DateUse="2010-08-31"/>
<DateUse DateUse="2010-09-01"/>
 <DayCode DayCode="Mon"/&开发者_开发技巧gt;
<DayCode DayCode="Tue"/>
<DayCode DayCode="Wed"/>
    </TimeCal> 
<TimeCal Cal="2">
<DateUse  DateUse ="2010-09-01"/>
<DateUse  DateUse ="2010-09-02"/>
<DateUse  DateUse ="2010-09-06"/>
<DateUse  DateUse ="2010-09-07"/>
<Day Day="Mon"/>
<Day Day="Tue"/>
<Day Day="Wed"/>
<Day Day="Thu"/>
</TimeCal>
<TimeCal Cal="3">
<DateUse  DateUse ="2010-09-03"/>
<DateUse  DateUse ="2010-09-10"/>
<DateUse  DateUse ="2010-09-01"/>
<Day Day="Fri"/>
</TimeCal>
<TimeCal Cal="4">
<DateUse  DateUse ="2010-08-29"/>
<DateUse  DateUse ="2010-09-05"/>
<DateUse  DateUse ="2010-09-01"/>
<Day Day="Sun"/>
</TimeCal>
<TimeCal Cal="5">
<DateUse  DateUse ="2010-09-04"/>
<DateUse  DateUse ="2010-09-11"/>
<DateUse  DateUse ="2010-09-02"/>
<Day Day="Sat"/>
</TimeCal>
</xml>

OUTPUT I want

DateUse          Cals
---------------- ----------------
2010-08-30       1
2010-08-31       1
2010-09-01       1, 2, 3, 4
2010-09-02       2, 5
2010-09-03       3
2010-09-04       5

and so on

Assume that output (xml) as step1 now step2 output as follows from the step1 results

Unique Cal Associated Day

1 Mon, Tue, Wed 3 Fri 5 Sat 2, 5 Mon, Tue, Wed, Thu, SAT 1, 2, 3, 4 Mon, Tue, Wed, Mon, Tue, Wed, Thu, Fri, Sun


Here is an XSLT 1.0 solution with formatting

<?xml version="1.0" encoding="utf-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
    xmlns:msxsl="urn:schemas-microsoft-com:xslt" exclude-result-prefixes="msxsl"
>
  <xsl:output method="text" indent="no" omit-xml-declaration="yes" />
  <xsl:strip-space elements="*"/>

    <xsl:template match="/xml/TimeCal/DateUse">
      <xsl:variable name="dateUse" select="@DateUse"/>
      <xsl:choose>
        <xsl:when test="not(preceding::DateUse[@DateUse=$dateUse])">
          <xsl:text>&#xD;&#xA;</xsl:text><xsl:value-of select="$dateUse"/>
          <xsl:text>&#x9;</xsl:text>
          <xsl:apply-templates select="//TimeCal[DateUse/@DateUse=$dateUse]" mode="distinct"/>
        </xsl:when>
      </xsl:choose>
    </xsl:template>

  <xsl:template match="TimeCal" mode="distinct">
    <xsl:value-of select="@Cal"/>
    <xsl:text>,</xsl:text>
  </xsl:template>


</xsl:stylesheet>


<xsl:for-each-group> is exactly the element you are looking for. the following code basically outputs what you want, but in xml format. Changing the format to text is trivial:

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="2.0">
    <xsl:output method="xml" indent="yes"/>
    <xsl:template match="/">
        <text>
        <xsl:for-each-group select="//TimeCal" group-by="DateUse/@DateUse">
            <row>
            <date><xsl:value-of select="current-grouping-key()"/></date>
                <xsl:for-each select="current-group()">
                    <calID><xsl:value-of select="@Cal"/></calID>
                </xsl:for-each>
            </row>
        </xsl:for-each-group>
        </text>
    </xsl:template>
</xsl:stylesheet>
0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜