XSLT将类似标记组合并与另一个标记值相关联

时间:2011-06-09 00:47:36

标签: xml xslt

<xml>
<TimeCal Cal ="1">
<DateUse DateUse="2010-08-30"/>
<DateUse DateUse="2010-08-31"/>
<DateUse DateUse="2010-09-01"/>
 <DayCode DayCode="Mon"/>
<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>

我想要的输出

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

等等

假设输出(xml)为step1,现在step2从step1结果

输出如下

独特的Cal Associated Day

星期一,星期二,星期三 3周五 5周六 2月5日星期一,星期二,星期三,星期四,SAT 1月,2日,3日,周一,周二,周三,周一,周二,周三,周四,周五,周日

2 个答案:

答案 0 :(得分:0)

<xsl:for-each-group>正是您要找的元素。以下代码基本上输出你想要的,但是以xml格式。将格式更改为文本很简单:

<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>

答案 1 :(得分:0)

这是一个带格式化的XSLT 1.0解决方案

<?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>