【问题标题】:How to improve my Muenchian grouping XSLT?如何改进我的 Muenchian 分组 XSLT?
【发布时间】:2013-05-11 03:45:35
【问题描述】:

感谢Niraj 的帮助和 hr_117 我得到了一个 XSL 模板来转换这个 XML...

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

我怎样才能得到这个函数来计算attendeessum

这是我需要的输出:

圣诞节:1 次预订,2 名参加者

万圣节:1 次预订,2 名参加者

复活节:2 位预订,2 位参加者

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

【问题讨论】:

    标签: xml xslt xslt-1.0 muenchian-grouping


    【解决方案1】:

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

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

    【讨论】:

    • 谢谢。我以为我以前尝试过,但事实证明我看不到所有树木的树林。我刚扔了一枚硬币,Navin 赢了,所以我把他的答案标记为正确的 ;-)
    【解决方案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>
    

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

    【讨论】:

    • 太好了,非常感谢!最后一件事:假设每个&lt;event&gt; 也有一个&lt;date&gt; 节点。那么是否可以按日期对输出进行排序?
    猜你喜欢
    • 1970-01-01
    • 2014-03-19
    • 1970-01-01
    • 2019-12-07
    • 2014-08-07
    • 2021-11-20
    • 2018-03-28
    • 2015-07-30
    • 2015-04-10
    相关资源
    最近更新 更多