XSLT使用for-each-group进行分组并使用填充元素
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了XSLT使用for-each-group进行分组并使用填充元素相关的知识,希望对你有一定的参考价值。
我有一个人员列表,我想用每个人的名字对它们进行分组,然后检查哪个<vitalDates>
node有值,并将其放在分组的<person>
节点中。
<persons>
<person>
<name>Goethe, Johann Wolfgang von </name>
<vitalDates>
<earliest/>
<latest/>
</vitalDates>
</person>
<person>
<name>Müthel, Lothar</name>
<vitalDates>
<earliest/>
<latest/>
</vitalDates>
</person>
<person>
<name>Goethe, Johann Wolfgang von</name>
<vitalDates>
<earliest>1749</earliest>
<latest>1832</latest>
</vitalDates>
</person>
<person>
<name>Müthel, Lothar</name>
<vitalDates>
<earliest>1896</earliest>
<latest>1964</latest>
</vitalDates>
</person>
<person>
<name>Goethe, Johann Wolfgang von</name>
<vitalDates>
<earliest>1749</earliest>
<latest>1832</latest>
</vitalDates>
</person>
</persons>
在片刻我有这个转变:
<persons>
<xsl:for-each-group select="person" group-by="name">
<person>
<name>
<xsl:value-of select="current-grouping-key()"/>
</name>
<vitalDates>
<earliest>
<xsl:for-each select="/persons/person[name=current-grouping-key()]/vitalDates/earliest">
<xsl:if test=". != ''">
<xsl:value-of select="."/>
</xsl:if>
</xsl:for-each>
</earliest>
<latest>
<!-- do the same? -->
</latest>
</vitalDates>
</person>
</xsl:for-each-group>
</persons>
我得到了这个结果:
<persons>
<person>
<name>Goethe, Johann Wolfgang von</name>
<vitalDates>
<earliest>17491749</earliest>
<latest></latest>
</vitalDates>
</person>
<person>
<name>Müthel, Lothar</name>
<vitalDates>
<earliest></earliest>
<latest></latest>
</vitalDates>
</person>
</persons>
就像你可以看到<earliest>
元素的值发现两次,但我只需要使用一个值,我不知道如何。
答案
首先,当你使用for-each-group
而不是/persons/person[name=current-grouping-key()]
时,你可以而且应该只使用current-group()
。
至于选择第一项,请使用(current-group()/vitalDates/earliest[normalize-space()])[1]
。
以上是关于XSLT使用for-each-group进行分组并使用填充元素的主要内容,如果未能解决你的问题,请参考以下文章
来自变量的 XSLT for-each-group 不起作用
XSLT Grouping's:将父级添加到子元素中的元素集