如何改进我的 Muenchian 分组 XSLT?
Posted
技术标签:
【中文标题】如何改进我的 Muenchian 分组 XSLT?【英文标题】:How to improve my Muenchian grouping 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>
我怎样才能得到这个函数来计算attendees
的sum?
这是我需要的输出:
圣诞节:1 次预订,2 名参加者
万圣节:1 次预订,2 名参加者
复活节:2 位预订,2 位参加者
感谢任何可以提供帮助的人!
【问题讨论】:
【参考方案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>
我们有 <xsl:value-of select="sum(key('bookings-within-period', event)/attendees)" />
来汇总所有与会者
【讨论】:
太好了,非常感谢!最后一件事:假设每个<event>
也有一个<date>
节点。那么是否可以按日期对输出进行排序?以上是关于如何改进我的 Muenchian 分组 XSLT?的主要内容,如果未能解决你的问题,请参考以下文章
XSLT:如何使用 Muenchian 分组将 XML 转换为文本文件