Xslt 删除XML中不太相同的节点

Xslt 删除XML中不太相同的节点,xslt,xpath,xquery,Xslt,Xpath,Xquery,我有一个如下所示的XML,我想去掉第二个节点,因为唯一的类是不同的。 我可以使用XSLT、xqy或xpath来实现这一点 <root> <name> <firstname>ABC</firstname> <class>12</class> </name> <name> <firstname>ABC</firstname>

我有一个如下所示的XML,我想去掉第二个节点,因为唯一的类是不同的。 我可以使用XSLT、xqy或xpath来实现这一点

<root>
   <name>
       <firstname>ABC</firstname>
       <class>12</class>
   </name>
   <name>
       <firstname>ABC</firstname>
       <class>11</class>
   </name>

   <name>
       <firstname>DEF</firstname>
       <class>9</class>
   </name>

   <name>
       <firstname>DEF</firstname>
       <class>10</class>
   </name>
</root>
预期产量为

<root>
   <name>
       <firstname>ABC</firstname>
       <class>12</class>
   </name>
   <name>
       <firstname>DEF</firstname>
       <class>9</class>
   </name>
</root>
任何指向这个方向的指针都会有帮助


谢谢

这是一个分组问题,因此XSLT2.0的使用

<xsl:template match="root">
  <xsl:copy>
   <xsl:for-each-group select="name" group-by="firstname">
     <xsl:copy-of select="."/>
   </xsl:for-each-group>
  </xsl:copy>
</xsl:template>
在XSLT1.0中,使用Muenchian分组

<xsl:key name="k1" match="name" use="firstname"/>

    <xsl:template match="root">
      <xsl:copy>
       <xsl:for-each select="name[generate-id() = generate-id(key('k1', firstname)[1])]">
         <xsl:copy-of select="."/>
       </xsl:for-each>
      </xsl:copy>
    </xsl:template>

这是一个分组问题,因此XSLT2.0使用

<xsl:template match="root">
  <xsl:copy>
   <xsl:for-each-group select="name" group-by="firstname">
     <xsl:copy-of select="."/>
   </xsl:for-each-group>
  </xsl:copy>
</xsl:template>
在XSLT1.0中,使用Muenchian分组

<xsl:key name="k1" match="name" use="firstname"/>

    <xsl:template match="root">
      <xsl:copy>
       <xsl:for-each select="name[generate-id() = generate-id(key('k1', firstname)[1])]">
         <xsl:copy-of select="."/>
       </xsl:for-each>
      </xsl:copy>
    </xsl:template>

XQuery,假设您可以选择每一秒的元素:

<root>{
  /root/name[position() mod 2 = 1]
}</root>
如果需要比较名称是否出现在前面,从而只保留名称的第一个实例,请将谓词更改为

<root>{
  /root/name[not(firstname = preceding-sibling::name/firstname)]
}</root>

XQuery,假设您可以选择每一秒的元素:

<root>{
  /root/name[position() mod 2 = 1]
}</root>
如果需要比较名称是否出现在前面,从而只保留名称的第一个实例,请将谓词更改为

<root>{
  /root/name[not(firstname = preceding-sibling::name/firstname)]
}</root>

您可以使用XSLT转换来完成此操作您可以使用XSLT转换来完成此操作