2013-10-18 63 views
0

我在這個格式的XML:XSLT - 合併子記錄

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

我想根據周的所有記錄內容進行合併,說41 2013-周將包含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> 

如何我可以使用或不同的元素組實現這一目標?我需要使用XSLT 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>