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

时间:2019-04-01 11:50:22

标签: xslt-2.0 xslt-grouping

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

1 个答案:

答案 0 :(得分:0)

在XSLT 2和3中,分组是使用xsl:for-each-grouphttps://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>

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