XSLT - 合并子记录

时间:2013-10-18 08:58:56

标签: xml xslt group-by records

我有这种格式的XML:

<Records>
  <Record id="1" type="1">
    <Field type="1">2013-Week 41</Field>
    <Field type="6">219</Field>
    <Field type="7">ABC</Field>
  </Record>
  <Record id="1" type="2">
    <Field type="1">2013-Week 41</Field>
    <Field type="6">220</Field>
    <Field type="7">PQR</Field>
  </Record>
  <Record id="1" type="3">
    <Field type="1">2013-Week 42</Field>
    <Field type="6">221</Field>
    <Field type="7">XYZ</Field>
  </Record>
</Records>

我想根据周合并所有Record元素,比如2013-Week 41将包含219,220作为子记录,2013-Wee 42将包含221等等。

我想要的输出是:

<Records>
    <Week>
        <Name>2013-Week 41</Name>
        <Week_Task>
            <Value>219</Value>
            <Name>ABC</Name>
        </Week_Task>
        <Week_Task>
            <Value>220</Value>
            <Name>PQR</Name>
        </Week_Task>
    </Week>
    <Week>
        <Name>2013-Week 42</Name>
        <Week_Task>
            <Value>221</Value>
            <Name>XYZ</Name>
        </Week_Task>
    </Week>
</Records>

如何使用group by或distinct元素来实现此目的?我需要使用XSLT 1.0。

1 个答案:

答案 0 :(得分:1)

好吧,如果你想使用XSLT 1.0,你既没有分组,也没有像XSLT 2.0那样的明显值。

使用XSLT 1.0,您需要使用Muenchian grouping

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

<xsl:output indent="yes"/>

<xsl:key name="by-week" match="Record" use="Field[@type = 1]"/>

<xsl:template match="Records">
  <xsl:copy>
    <xsl:apply-templates select="Record[generate-id() = generate-id(key('by-week', Field[@type = 1])[1])]"/>
  </xsl:copy>
</xsl:template>

<xsl:template match="Record">
  <Week>
    <Name><xsl:value-of select="Field[@type = 1]"/></Name>
    <xsl:apply-templates select="key('by-week', Field[@type = 1])" mode="task"/>
  </Week>
</xsl:template>

<xsl:template match="Record" mode="task">
  <Week_Task>
    <xsl:apply-templates select="Field[not(@type = 1)]"/>
  </Week_Task>
</xsl:template>

<xsl:template match="Field[@type = 6]">
  <Value><xsl:value-of select="."/></Value>
</xsl:template>

<xsl:template match="Field[@type = 7]">
  <Name><xsl:value-of select="."/></Name>
</xsl:template>

</xsl:stylesheet>