我有以下示例XML代码和我所需的输出。我需要删除重复的行,这是每个实例。你能帮我看看如何使用XSLT 2.0实现这一目标
<?xml version="1.0" encoding="UTF-8"?>
<Root>
<Row>
<Company>Xyzz</Company>
<Account>123567</Account>
<Amount>223.33</Amount>
</Row>
<Row>
<Company>Xyzz</Company>
<Account>123567</Account>
<Amount>223.33</Amount>
</Row>
<Row>
<Company>Xyzz</Company>
<Account>123567</Account>
<Amount>223.33</Amount>
</Row>
<Row>
<Company>pror</Company>
<Account>123567</Account>
<Amount>423.33</Amount>
</Row>
<Row>
<Company>abcd</Company>
<Account>123567</Account>
<Amount>123.33</Amount>
</Row>
</Root>
要求输出:
<?xml version="1.0" encoding="UTF-8"?>
<Root>
<Row>
<Company>pror</Company>
<Account>123567</Account>
<Amount>423.33</Amount>
</Row>
<Row>
<Company>abcd</Company>
<Account>123567</Account>
<Amount>123.33</Amount>
</Row>
</Root>
使用xsl:for-each-group
(https://www.w3.org/TR/xslt-30/#element-for-each-group)进行XSLT 2和3中的分组,因此select="Row"
作为分组填充,决定您想要哪个分组键,如果要将所有子元素值用作复合分组键,则在XSLT 3中使用xsl:for-each-group select="Row" composite="yes" group-by="*"
;在for-each-group
内你可以访问current-group()
并且只能通过选择.[not(tail(current-group()))]
来输出(或通常处理)其第一个和唯一的项目,如果组中只有一个项目,因为.
代表组中的第一个项目,not(tail(current-group()))
将是如果组中没有第二项,则为true:
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:xs="http://www.w3.org/2001/XMLSchema"
exclude-result-prefixes="#all"
version="3.0">
<xsl:output indent="yes"/>
<xsl:mode on-no-match="shallow-copy"/>
<xsl:template match="Root">
<xsl:copy>
<xsl:for-each-group select="Row" composite="yes" group-by="*">
<xsl:apply-templates select=".[not(tail(current-group()))]"/>
</xsl:for-each-group>
</xsl:copy>
</xsl:template>
</xsl:stylesheet>