我有以下示例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>
答案 0 :(得分:0)
在XSLT 2和3中,分组是使用xsl:for-each-group
(https://www.w3.org/TR/xslt-30/#element-for-each-group)完成的,因此,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>