如何改进我的Muenchian分组XSLT?

时间:2013-05-16 09:52:11

标签: xml xslt xslt-1.0 muenchian-grouping

感谢Niraj和{。}的帮助 hr_117我能够到达一个转换这个XML的XSL模板......

<bookings>
  <entry>
    <event>Christmas</event>
    <attendees>2</attendees>
  </entry>
  <entry>
    <event>Halloween</event>
    <attendees>2</attendees>
  </entry>
  <entry>
    <event>Easter</event>
    <attendees>1</attendees>
  </entry>
  <entry>
    <event>Easter</event>
    <attendees>1</attendees>
  </entry>
</bookings>

...进入此输出:

  

圣诞节:1个预订

     

万圣节:1个预订

     

复活节:2次预订

这是我的XSL:

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

<xsl:template match="data">
  <xsl:apply-templates select="bookings"/>
</xsl:template>

<xsl:key name="bookings-within-period" match="bookings/entry" use="event" />

<xsl:template match="bookings">
  <xsl:for-each select="entry[count(. | key('bookings-within-period', event)[1]) = 1]">
      <p>
          <xsl:value-of select="concat(event,': ')" />
          <xsl:value-of select="count(key('bookings-within-period', event))" />
          <xsl:text> booking(s)</xsl:text>          
      </p>
  </xsl:for-each>
</xsl:template>

</xsl:stylesheet>

我如何才能使用此函数计算attendees总和

这是我需要的输出:

  

圣诞节:1个预订,2个与会者

     

万圣节:1个预订,2个与会者

     

复活节:2个预订,2个与会者

感谢任何可以提供帮助的人!

2 个答案:

答案 0 :(得分:3)

使用key('bookings-within-period', event)为您提供每个组中的entry元素,然后sum(key('bookings-within-period', event)/attendees)为您提供每个组中attendees的总和。

您需要在for-each内部执行此操作,其中每个组中的第一个entry元素是上下文节点,如果不清楚的话。

答案 1 :(得分:2)

增强型XSLT如下:

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

  <xsl:template match="data">
    <xsl:apply-templates select="bookings"/>
  </xsl:template>

  <xsl:key name="bookings-within-period" match="bookings/entry" use="event" />

  <xsl:template match="bookings">
    <xsl:for-each select="entry[count(. | key('bookings-within-period', event)[1]) = 1]">
      <p>
        <xsl:value-of select="concat(event,': ')" />
        <xsl:value-of select="count(key('bookings-within-period', event))" />
        <xsl:text> booking(s), </xsl:text>
        <xsl:value-of select="sum(key('bookings-within-period', event)/attendees)" />
        <xsl:text> attendee(s)</xsl:text>
      </p>
    </xsl:for-each>
  </xsl:template>

</xsl:stylesheet>

我们有<xsl:value-of select="sum(key('bookings-within-period', event)/attendees)" />来汇总所有与会者