我有这种格式的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。
答案 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>