Как удалить дубликаты, включая первый экземпляр, и просто включить уникальные неповторяющиеся узлы? - PullRequest
0 голосов
/ 01 апреля 2019

У меня есть приведенный ниже пример 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 голосов
/ 01 апреля 2019

Группирование в XSLT 2 и 3 выполняется с использованием xsl:for-each-group (https://www.w3.org/TR/xslt-30/#element-for-each-group),, поэтому select="Row" в качестве совокупности группировок, решите, какой ключ группировки вам нужен, если вы хотите использовать все значения дочерних элементов в качестве составногоключ группировки, который вы используете xsl:for-each-group select="Row" composite="yes" group-by="*" в XSLT 3, а внутри for-each-group вы получаете доступ к current-group() и можете выводить (или вообще обрабатывать) свой первый и единственный элемент, если в группе есть только один элемент:выбор .[not(tail(current-group()))] в качестве . представляет первый элемент в группе, и not(tail(current-group())) будет истинным, если в группе нет второго элемента:

<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 -развитие.сеть / ej9EGcj /

...