[英]XSLT-2.0: grouping by node content
我们需要对第一列的内容对表行进行分组,然后对组中的每一行进行一定数量的处理。 第一列的内容-数字。 如果列中不包含任何数字,将使用for-each-group
。
输入示例:
<table> <tr><td>1</td></tr> <tr><td>2</td></tr> <tr><td>1</td></tr> <tr><td>1,2,3</td></tr> <tr><td>1,4</td></tr> </table>
根据任务,我应该分为4组:
通用模板如下所示:
<xsl:template match="table"> <xsl:for-each-group select="tr" group-by="td[1]"> <xsl:for-each select="current-group()"> <!-- transformation --> </xsl:for-each> </xsl:for-each-group> </xsl:template>
因此, group-by = "td [1]"
不起作用。
带正则表达式的键...我觉得很难。
听起来好像您要将<xsl:for-each-group select="tr" group-by="td[1]">
替换<xsl:for-each-group select="tr" group-by="td[1]">
<xsl:for-each-group select="tr" group-by="tokenize(td[1], ',')">
。
我想你是在说
从最后一点开始,一行将在其第一列中的逗号分隔列表中的每个数字出现一次,或者在该列表中的每个不同值出现一次(说明不明确)。
我会尝试
<xsl:for-each-group select="tr"
group-by="tokenize(td[1],',')">
<xsl:message>Now processing <xsl:value-of
select="count(current-group()"/>rows containing <xsl:value-of
select="current-grouping-key()"/> in column 1.</
...
</
(未经测试。)
如果要输出包含每个组的值的原始行号,我认为您需要将输入转换为另一个包含原始position()
。 像这样:
<xsl:template match="table">
<xsl:variable name="row-data">
<xsl:for-each select="tr/td">
<xsl:variable name="row" select="position()" />
<xsl:for-each select="tokenize(., ',')">
<data>
<xsl:attribute name="row" select="$row" />
<xsl:attribute name="value" select="." />
</data>
</xsl:for-each>
</xsl:for-each>
</xsl:variable>
<data>
<xsl:for-each-group select="$row-data/*" group-by="@value">
<group>
<xsl:attribute name="value" select="@value" />
<xsl:value-of select="current-group()/@row" separator=","/>
</group>
</xsl:for-each-group>
</data>
</xsl:template>
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.