我想知道是否有办法搜索xml中的重复项,然后发现将所有重复项聚合到一个节点。 F.eks
<car name="one">
<person>john</person>
<person>Jay</person>
</car>
<car name="two">
<person>kim</person>
<person>chris</person>
</car>
<car name="one">
<person>jane</person>
<person>liz</person>
</car>
应该是:
<car name="one">
<person>john</person>
<person>Jay</person>
<person>jane</person>
<person>liz</person>
</car>
<car name="two">
<person>kim</person>
<person>chris</person>
</car>
非常感谢所有帮助!
Br Kim
答案 0 :(得分:1)
如果您使用的是XSLT 2.0,则可以按如下方式使用xsl:for-each-group
:
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/>
<xsl:template match="/data">
<data>
<xsl:for-each-group select="car" group-by="@name">
<car name="{current-grouping-key()}">
<xsl:for-each select="current-group()/person">
<person><xsl:value-of select="." /></person>
</xsl:for-each>
</car>
</xsl:for-each-group>
</data>
</xsl:template>
</xsl:stylesheet>
应用于以下输入时:
<?xml version="1.0" encoding="UTF-8"?>
<data>
<car name="one">
<person>john</person>
<person>Jay</person>
</car>
<car name="two">
<person>kim</person>
<person>chris</person>
</car>
<car name="one">
<person>jane</person>
<person>liz</person>
</car>
</data>
它产生正确的输出:
<?xml version="1.0" encoding="UTF-8"?>
<data>
<car name="one">
<person>john</person>
<person>Jay</person>
<person>jane</person>
<person>liz</person>
</car>
<car name="two">
<person>kim</person>
<person>chris</person>
</car>
</data>
答案 1 :(得分:1)
在XSLT 1.0中,您必须使用名为Muenchian Method的内容,这是使用key
和generate-id
函数对元素进行分组的过程。
这个过程是这样的:
首先定义一个表示要分组的数据的键。
<xsl:key name="car-by-name" match="car" use="@name"/>
然后,您可以通过基于该密钥生成ID来在模板匹配中使用该密钥。
<xsl:apply-templates select="car[generate-id() = generate-id(key('car-by-name', @name)[1])]" mode="group"/>
现在你已经对节点进行了分组,你所要做的就是再次使用该密钥来获取该密钥中的所有节点。
<xsl:apply-templates select="key('car-by-name', @name)"/>
所以现在一起展示这一切,当你使用这个XML(添加document
以使其格式良好)。
<document>
<car name="one">
<person>john</person>
<person>Jay</person>
</car>
<car name="two">
<person>kim</person>
<person>chris</person>
</car>
<car name="one">
<person>jane</person>
<person>liz</person>
</car>
</document>
并应用此XSLT
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" indent="yes" />
<xsl:key name="car-by-name" match="car" use="@name"/>
<xsl:template match="@* | node()">
<xsl:copy>
<xsl:apply-templates select="@* | node()"/>
</xsl:copy>
</xsl:template>
<xsl:template match="document">
<xsl:copy>
<xsl:apply-templates select="car[generate-id() = generate-id(key('car-by-name', @name)[1])]" mode="group"/>
</xsl:copy>
</xsl:template>
<xsl:template match="car" mode="group">
<car name="{@name}">
<xsl:apply-templates select="key('car-by-name', @name)"/>
</car>
</xsl:template>
<xsl:template match="car">
<xsl:apply-templates select="@*|node()"/>
</xsl:template>
</xsl:stylesheet>
它产生了这个结果。
<?xml version="1.0" encoding="UTF-8"?>
<document>
<car name="one">
<person>john</person>
<person>Jay</person>
<person>jane</person>
<person>liz</person>
</car>
<car name="two">
<person>kim</person>
<person>chris</person>
</car>
</document>