如何删除重复项,包括第一个实例,只包括唯一的非重复节点?

问题描述 投票:0回答:1

我有以下示例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>

xslt-2.0 xslt-grouping
1个回答
0
投票

使用xsl:for-each-grouphttps://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>

https://xsltfiddle.liberty-development.net/ej9EGcj/

© www.soinside.com 2019 - 2024. All rights reserved.