Xml XSLT-一步获得唯一键并合并数据

Xml XSLT-一步获得唯一键并合并数据,xml,xslt,distinct,Xml,Xslt,Distinct,我有一个XML文件,其中有几年的字段,分别是Year1、Year2、Year3 <?xml version="1.0" encoding="utf-16"?> <data> <row> <field fieldno="Name">Hello</field> <field fieldno="Year1">2014</field> <field fieldno="Year2">2015</fiel

我有一个XML文件,其中有几年的字段,分别是Year1、Year2、Year3

<?xml version="1.0" encoding="utf-16"?>
<data>
 <row>
<field fieldno="Name">Hello</field>
<field fieldno="Year1">2014</field>
<field fieldno="Year2">2015</field>
<field fieldno="Year3">2016</field>

</row>
 <row>
<field fieldno="Name">NotWelcome</field>
<field fieldno="Year1">2016</field>
<field fieldno="Year2">2017</field>
<field fieldno="Year3">2018</field>
</row>
<row>
<field fieldno="Name">Welcome</field>
<field fieldno="Year1">2014</field>
<field fieldno="Year2">2015</field>
<field fieldno="Year3">2016</field>
</row>
<row>
<field fieldno="Name">Goodbye</field>
<field fieldno="Year1">2015</field>
<field fieldno="Year2">2016</field>
<field fieldno="Year3">2017</field>
 </row>
</data>
我希望在XML文件中获得所有出现年份,但只获得一次,因此对于我的文件,我需要:

2014 2015 2016 2017 2018

我读了一些关于穆钦分组的资料,通过这种转换得到了一个字段的正确结果:

    <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
      <xsl:key name="unique-year" match="row" use="field[@fieldno='Year1']" />
      <xsl:key name="unique-year2" match="row" use="field[@fieldno='Year2']" />
      <xsl:key name="unique-year3" match="row" use="field[@fieldno='Year3']" />

      <xsl:template match="data">
        <xsl:for-each select="row[count(. | key('unique-year', field[@fieldno='Year1'])[1]) = 1]">
          <xsl:sort select="field[@fieldno='Year1']" />
          <xsl:value-of select="field[@fieldno='Year1']" />
        </xsl:for-each>
      </xsl:template>
    </xsl:stylesheet>
但是我真的不知道如何合并单个结果,所以我得到了一个整体结果

我该怎么办

此外,我不理解这条线,我只是根据自己的要求采用它,但我不知道这里发生了什么:

  <xsl:for-each select="row[count(. | key('unique-year', field[@fieldno='7015'])[1]) = 1]">
你们有人能解释一下这里发生了什么吗

谢谢和亲切的问候


Alex

以下样式表:

XSLT1.0

不确定你的真实情况是什么,但在这种情况下:

row/field[@fieldno='Year1' or @fieldno='Year2' or @fieldno='Year3']
可简化为:

row/field[@fieldno!='Name']
编辑: 要计算不同的值,请使用:

<xsl:value-of select="count(row/field[@fieldno='Year1' or @fieldno='Year2' or @fieldno='Year3'][count(. | key('field', .)[1]) = 1])" />

在同一模板内,但在元素外。

要理解Muenchian分组,请阅读权威文章:-您的问题很难理解,因为您的样式表不符合XML示例。此外,您需要向我们提供预期的输出。哦,非常抱歉,我修改了样式表。目前的输出是:201420152016->如果我能得到20142015201620172018,我会很高兴。我的问题的一个特殊问题是,我想在几个领域进行分组。这非常顺利,非常感谢。是否有可能将记录的数量放入一个变量中,因此在我们的案例5中?在此期间,我尝试了几种方法,这一方法希望我提供正确的结果:是否有人可以确认这种方法是正确的?这个有效。。但我真的很难做到understand@user3898488请参阅对我的帖子的编辑另外,请不要在评论中发布代码,因为它不可读
row/field[@fieldno!='Name']
<xsl:value-of select="count(row/field[@fieldno='Year1' or @fieldno='Year2' or @fieldno='Year3'][count(. | key('field', .)[1]) = 1])" />