2012-02-23 2 views
2

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

например.

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

ответ

0

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> 

Объяснение: Использование Muenchian method for grouping.


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

Спасибо Dimitre, Но я хочу отображение в пользовательском интерфейсе с только значениями, когда я попробовал сам, не давая мне получить точные результаты. как и ожидалось. Он отображается как нулевое значение, и никакие выходы не отображаются. – user1227273

+0

Привет, Dimitre, я понял концепцию, но теперь проблема для меня. <Локальный идентификатор = тип "1" = "Primary"> - <резюме Date = "23-02-12"> - яблоко - Оранжевый - <резюме Date = "23-02-12"> - яблоко - манго Таким образом, в этом случае, я могу попасть в местный , но не в состоянии прочитать данные. Не могли бы вы мне помочь? – user1227273

+0

@ user1227273: Пожалуйста, отредактируйте этот вопрос, или, лучше, задайте новый вопрос - комментарии не подходят для форматирования кода. Кроме того, thext в вашем последнем комментарии не является хорошо сформированным XML-документом.Вам также необходимо предоставить точный желаемый результат - будет ли это копия узлов или только их текст или HTML. –

 Смежные вопросы

  • Нет связанных вопросов^_^