Xslt 删除XML中不太相同的节点
我有一个如下所示的XML,我想去掉第二个节点,因为唯一的类是不同的。 我可以使用XSLT、xqy或xpath来实现这一点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>
<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转换来完成此操作