Чтение записей в цикле и удаление повторяющихся записей с использованием XSL - PullRequest
2 голосов
/ 23 февраля 2012

Я новичок в XSL, и у меня возникла путаница, можем ли мы прочитать данные в теге xml, а затем сохранить их в массиве или в чем-то другом, а затем удалить дубликат с помощью отдельной опции.

например.

<local>
  <ID>
    <fruit>apple</fruit>
    <fruit>orange</fruit>
  </ID>
  <ID>
    <fruit>apple</fruit>
    <fruit>mango</fruit>
  </ID>
</local> 

В этом я читаю через Local как инициатор цикла и должен прочитать все идентификаторы под ним и отобразить фрукты.В данном случае я не вижу там 4 разных фруктов и один дублируется, поэтому я просто хочу отобразить их уникальные записи и показать.Есть ли возможность сделать это с помощью XSLT?

<xsl:for-each select="Local">  
  <xsl:variable name="fruits">
    <xsl:for-each select="set:distinct(ID/fruit)">
      <xsl:copy-of select="."/>
    </xsl:for-each>
  </xsl:variable>
</xsl:for-each>

1 Ответ

0 голосов
/ 23 февраля 2012

I.Это преобразование XSLT 1.0 :

<xsl:stylesheet version="1.0"
 xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
 <xsl:output omit-xml-declaration="yes" indent="yes"/>
 <xsl:strip-space elements="*"/>

 <xsl:key name="kFruitByName" match="fruit" use="."/>

 <xsl:template match="/">
   <xsl:copy-of select=
   "/*/*/fruit
     [generate-id()
     =
      generate-id(key('kFruitByName', .)[1])
     ]"/>
</xsl:template>
</xsl:stylesheet>

при применении к предоставленному документу XML :

<local>
    <ID>
        <fruit>apple</fruit>
        <fruit>orange</fruit>
    </ID>
    <ID>
        <fruit>apple</fruit>
        <fruit>mango</fruit>
    </ID>
</local>

дает требуемый, правильный результат :

<fruit>apple</fruit>
<fruit>orange</fruit>
<fruit>mango</fruit>

Пояснение : Использование мюнхенского метода для группировки .


II.Решение XSLT 2.0 :

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

 <xsl:template match="/*">
  <xsl:for-each-group select="*/fruit" group-by=".">
    <xsl:sequence select="."/>
  </xsl:for-each-group>
 </xsl:template>
</xsl:stylesheet>

Когда это преобразование применяется к тому же XML-документу (см. Выше), снова получается тот же правильный результат :

<fruit>apple</fruit>
<fruit>orange</fruit>
<fruit>mango</fruit>
...