计算行元素并在xslt中重置

时间:2014-03-26 15:53:04

标签: count xslt-1.0

我必须从csv文件中读取并通过xslt生成格式化对象。我面临两天的问题是我必须计算行数,当一个新值连续显示时,我必须再次重置为1。

600, A, B, C , D
600, A, B, G, F
600, A, B, E, H
601, A, B, I, K

我的输出目前是这样的

<Object:<path:A/600/1>><Data:<ZoneStart:B><ZoneFinish:C><Id:D>>>
<Object:<path:A/600/2>><Data:<ZoneStart:B><ZoneFinish:C><Id:D>>>
<Object:<path:A/600/3>><Data:<ZoneStart:B><ZoneFinish:C><Id:D>>>
<Object:<path:A/601/4>><Data:<ZoneStart:B><ZoneFinish:C><Id:D>>>

但我希望如此:

<Object:<path:A/600/1>><Data:<ZoneStart:B><ZoneFinish:C><Id:D>>>
<Object:<path:A/600/2>><Data:<ZoneStart:B><ZoneFinish:C><Id:D>>>
<Object:<path:A/600/3>><Data:<ZoneStart:B><ZoneFinish:C><Id:D>>>
<Object:<path:A/601/1>><Data:<ZoneStart:B><ZoneFinish:C><Id:D>>>

创建计数部分并在xslt 1.0中重置它正在扼杀我。需要帮助。

1 个答案:

答案 0 :(得分:0)

XSLT是一种声明性的函数式语言。只要您在程序性方面考虑增加和清除计数器,您将会使用该语言,而不是使用它。即使你赢了有时会发生的战斗,结果也不会很好。

用更多的声明性语言重新制定你的表观要求,听起来像是:

  • 对于每行输入,生成一行输出,将输入中的各个字段复制到输出中的适当位置。
  • 在每行输出中,插入一个数字,特别是数字1加上前一行输入行的数量,这些行在输入的第一个字段中具有相同的值。 (因此具有给定值的第一行获得数字1,第二行获得数字2等)

您的输出已满足第一个要求。你的工作是找到一种功能性,声明性的方式来满足第二种方式。

满足第二个要求的最方便的方法部分取决于您当前如何迭代输入线。 (如果您的输入实际上是非XML数据,正如您所显示的那样,那么我在XSLT 1.0中根本不知道您是如何使用它的;如果您使用的是XSLT 2.0,那么您无意中会出现错误问题。)

假设您显示的多行输入是名为“逐行数据”的某个元素的内容,我将使用以下内容在XSLT 1.0中处理它:

<xsl:template match="line-by-line-data">
  <xsl:call-template name="handle-lines">
    <xsl:with-param name="lines" select="string(.)"/>
  </xsl:call-template>
</xsl:template>

模板handle-lines将是一个递归模板,它会切断一行输入,处理它,并递归调用自身。

如果你正在使用XSLT 1.0并生成你显示的输出,我猜你已经有了这样一个递归模板,只需要以下提示。在递归调用中添加两个参数:一个是字段1的值,因此您可以方便地检查它是否已更改;另一个是你已经看过的那个字段有多少值的运行计数。即使从纯粹的程序角度来看,这应该让人感觉非常舒服:想象一下,在递归是执行迭代的唯一方法的语言中。

如果您正在使用XSLT 1.0并通过其他方式生成输出,那么请在您的问题中向我们展示这些方法。

祝你好运!