Чтение записей в цикле и удаление повторяющихся записей с помощью XSL

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

eg.

<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>

person user1227273    schedule 23.02.2012    source источник


Ответы (1)


И. Это преобразование 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>
person Dimitre Novatchev    schedule 23.02.2012
comment
Спасибо, Димитре, но я хочу отображать в пользовательском интерфейсе только значения, когда я пытался так же, это не позволяет мне получить точные результаты. как и ожидалось. Он отображается как нулевое значение, и никакие выходные данные не отображаются. - person user1227273; 23.02.2012
comment
Привет, Дмитрий, я понял концепцию, но теперь проблема для меня. ‹Local id=1 type=Primary› -‹summary Date=23-02-12› -‹fruit›apple‹/фрукты› -‹fruit›Orange‹/фрукты› ‹/summary› ‹/local› ‹Local id= 2 type=Primary› -‹summary Date=23-02-12› -‹фрукты›яблоко‹/фрукты› -‹фрукты›манго‹/фрукты› ‹/резюме› ‹/местные› Итак, в данном случае я смог попасть в локальный, но не смог прочитать данные. Не могли бы вы помочь мне в этом? - person user1227273; 23.02.2012
comment
@ user1227273: Пожалуйста, отредактируйте вопрос или, лучше, задайте новый вопрос — комментарии неудобны для форматирования кода. Кроме того, текст в вашем последнем комментарии не является правильно сформированным XML-документом. Вам также необходимо предоставить точный желаемый результат — будь то копия узлов, просто их текст или HTML. - person Dimitre Novatchev; 23.02.2012