XSLT 半小时分组
给定这个 XML:
<root>
<row>
<time>08:00</time>
<sales>800</sales>
</row>
<row>
<time>08:15</time>
<sales>815</sales>
</row>
<row>
<time>08:30</time>
<sales>830</sales>
</row>
<row>
<time>08:45</time>
<sales>845</sales>
</row>
<row>
<time>11:00</time>
<sales>1100</sales>
</row>
<row>
<time>11:45</time>
<sales>1145</sales>
</row>
<row>
<time>14:15</time>
<sales>1415</sales>
</row>
<row>
<time>14:30</time>
<sales>1430</sales>
</row>
</root>
我试图找到一种通过按 30 分钟间隔汇总销售额来进行 XSLT 转换的方法。我可以使用 MUENCHIAN 方法按每小时 60 分钟的间隔进行汇总,但我不能使用它 30 分钟,因为我需要一个自定义函数来执行此操作(但我不能使用 XSLT 2.0,也不能使用 .Net 的自定义函数)。请帮忙!
预期输出是这样的:
30 minute
08:00 $1600
08:30 $1675
11:00 $1100
11:30 $1145
14:00 $1415
14:30 $1430
Given this XML:
<root>
<row>
<time>08:00</time>
<sales>800</sales>
</row>
<row>
<time>08:15</time>
<sales>815</sales>
</row>
<row>
<time>08:30</time>
<sales>830</sales>
</row>
<row>
<time>08:45</time>
<sales>845</sales>
</row>
<row>
<time>11:00</time>
<sales>1100</sales>
</row>
<row>
<time>11:45</time>
<sales>1145</sales>
</row>
<row>
<time>14:15</time>
<sales>1415</sales>
</row>
<row>
<time>14:30</time>
<sales>1430</sales>
</row>
</root>
I am trying to find a way to XSLT transform by summarizing sales by 30 minute intervals. I can summarize by hourly intervals by 60 minutes using MUENCHIAN method, but I cannot use it for 30 minute since I need a custom function to do so (but I cannot use XSLT 2.0, nor .Net's custom functions). Please help!
The expected output is this:
30 minute
08:00 $1600
08:30 $1675
11:00 $1100
11:30 $1145
14:00 $1415
14:30 $1430
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(2)
解决方案 1。
此转换:
应用于提供的 XML 文档时:
产生所需的正确结果:
解决方案 2:
当将此转换应用于与上述相同的 XML 文档时,会产生相同的所需正确结果:
解释:
)"/> <xsl:value-of select= "sum(sales|following-sibling::* [not(translate(time,':','') >= translate($vStart/following-sibling::*,':','') ) ] /sales ) "/> </xsl:if> </xsl:template> </xsl:stylesheet>我们使用
并将group-adjacent
属性 设置为计算表达式行/时间
所在的 1/2 小时周期的位置。大量使用标准函数
current-group()
和current-grouping-key()
。当此转换应用于同一个 XML 文档时,再次生成所需的正确结果:
说明:
在变量
$vhalfHrs< /code> 我们有一些元素,其值为一天中每半小时的开始时间。
在匹配每个
行
的模板中,$vStart
变量设置为这个半小时的开始时间,其中<code>时间row) 的 > 落入。变量
$vprecRow
设置为当前行
的前一个同级 (row
)。如果前
行
的时间不晚于开始半小时时间(在$vStart中),则当前
行`是第一行在此半小时内有一个。我们输出开始的半小时周期时间。
我们计算并输出
time
位于同一半小时时间段内的所有row
元素的总和。它们跟随当前行
的同级,并且它们的时间
不大于或等于下一个半小时周期的开始时间。解决方案 3 (XSLT 2.0):
当将此转换应用于与上述相同的 XML 文档时,会产生相同的所需正确结果:
解释:
我们使用
并将group-adjacent
属性 设置为计算表达式行/时间
所在的 1/2 小时周期的位置。大量使用标准函数
current-group()
和current-grouping-key()
。Solution 1.
This transformation:
when applied on the provided XML document:
produces the wanted, correct result:
Solution 2:
when this transformation is applied on the same XML document as above, the same wanted, correct result is produced:
Explanation:
)"/> <xsl:value-of select= "sum(sales|following-sibling::* [not(translate(time,':','') >= translate($vStart/following-sibling::*,':','') ) ] /sales ) "/> </xsl:if> </xsl:template> </xsl:stylesheet>We are using
<xsl:for-each-group>
with thegroup-adjacent
attribute set as an expression calculating the position of the 1/2 hour period in which arow/time
is.Heavy use of the standard functions
current-group()
andcurrent-grouping-key()
.when this transformation is applied on the same XML document, again the wanted, correct result is produced:
Explanation:
In the variable
$vhalfHrs
we have elements whose values are the starting time of every half-hour period during the day.In the template that matches every
row
, the$vStart
variable is set ti this half-hour start-time, in which thetime
of the current node (row
) falls into.The variable
$vprecRow
is set to the preceding sibling (row
) of the currentrow
.If the time of the preceding
row
is not later than the start-half-hour-time (in $vStart), then the current
row` is the first one in this half-hour period.We output the starting half-hour period time.
We calculate and output the sum of all
row
elements whosetime
is in this same half-hour time period. They are following siblings of the currentrow
and theirtime
is not greater or equal the start of the next half-hour period.Solution 3 (XSLT 2.0):
when this transformation is applied on the same XML document as above, the same wanted, correct result is produced:
Explanation:
We are using
<xsl:for-each-group>
with thegroup-adjacent
attribute set as an expression calculating the position of the 1/2 hour period in which arow/time
is.Heavy use of the standard functions
current-group()
andcurrent-grouping-key()
.如果没有前面的轴,此样式表:
输出:
编辑 2:更好的键值,标准化时间允许参数化(通过
document()
函数或两阶段转换):如果我们采取关键计算作为复杂性度量,这将是 O(N)Without preceding axis, this stylesheet:
Output:
Edit 2: Even better key value with normalized time allowing parameterization (by
document()
function or two phase transformation): if we take key calculation as complexity measure, this will be O(N)