Получить уникальные узлы на основе значения атрибута xslt 1.0 - PullRequest
0 голосов
/ 25 января 2019

У меня ниже XML в переменной, мне нужно получить уникальные узлы в xslt 1.0

    <out2:PrintRequest>
        <Passenger FirstNameNumber="01" LastNameNumber="01"/>
        <Passenger FirstNameNumber="01" LastNameNumber="02"/>
        <Passenger FirstNameNumber="01" LastNameNumber="01"/>
        <Passenger FirstNameNumber="01" LastNameNumber="02"/>
    </out2:PrintRequest>

================================= ожидаемый результат:

    <out2:PrintRequest>
        <Passenger FirstNameNumber="01" LastNameNumber="01"/>
        <Passenger FirstNameNumber="01" LastNameNumber="02"/>
    </out2:PrintRequest>

1 Ответ

0 голосов
/ 25 января 2019

Вы можете использовать метод Meunchian для группировки, создав xsl:key для элементов Passenger, используя значения из атрибутов @FirstNameNumber и @LastNameNumber для построения значения поиска ключа, итерациянад каждым из элементов Passenger и скопируйте элемент, если он является первым элементом, полученным из xsl:key для этого значения ключа группировки.

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0" xmlns:out2="out2">
  <xsl:output indent="yes"/>

  <xsl:key name="passengers-by-num" match="Passenger" use="concat(@FirstNameNumber,@LastNameNumber)"/>

  <xsl:template match="out2:PrintRequest">
    <xsl:copy>
        <xsl:for-each select="Passenger[generate-id() = generate-id(key('passengers-by-num', concat(@FirstNameNumber,@LastNameNumber)[1]))]">
            <xsl:copy-of select="."/>          
      </xsl:for-each>
    </xsl:copy>
  </xsl:template>

</xsl:stylesheet>

Если вы можете использовать XSLT 2.0 (или 3.0), тогда это будет немного проще.Вы можете использовать xsl: for-each-group :

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="2.0" xmlns:out2="out2">
  <xsl:output indent="yes"/>

  <xsl:template match="out2:PrintRequest">
    <xsl:copy>
        <xsl:for-each-group select="Passenger" group-by="concat(@FirstNameNumber,@LastNameNumber)">
            <xsl:copy-of select="."/>          
      </xsl:for-each-group>
    </xsl:copy>
  </xsl:template>

</xsl:stylesheet>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...