Сохранение в переменную и отображение уникальных записей с использованием XSL - PullRequest
0 голосов
/ 23 февраля 2012

В этом я хочу отображать только уникальные записи фруктов в нем. Вот тег XML, который я использую для анализа

<main>
<local id="1" type="Primary"> 
-<summary Date="23-02-12"> 
-<fruit>apple</fruit> 
-<fruit>Orange</fruit> 
</summary> 
</local> 
<local id="2" type="Primary"> 
-<summary Date="23-02-12"> 
-<fruit>apple</fruit> 
-<fruit>mango</fruit> 
</summary> 
</local> 
</main>

Ожидаемый результат должен быть в следующем формате

<fruit>apple</fruit>
<fruit>Orange</fruit>
<fruit>Mango</fruit>

Вот фрагмент кода, который я пытаюсь использовать

<xsl:for-each select="main/local">  
<xsl:for-each select="symbol/fruit">
    <xsl:copy-of select="."/>
    <xsl:copy-of select="fruit[not(.=$fruit)]"/>
</xsl:for-each>
</xsl:for-each>

Но я не получаю никакого выходного дисплея для этого. Не могли бы вы помочь мне, как я могу удалить эту дублирующую избыточность отсюда.? Заранее спасибо

1 Ответ

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

Чтобы сделать это в XSLT1.0, вы можете использовать технику, называемую группировкой Meunchian.Сначала вы определяете ключ для поиска элементов fruit на основе значения

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

Затем, чтобы получить уникальные названия фруктов, вы выбираете fruit элементы, которые оказываются первыми фруктовыми элементами в ключе (и для проверки одинаковы два узла используется метод generate-id ())

<xsl:apply-templates 
    select="//fruit[generate-id() = generate-id(key('fruit', .)[1])]" />

Вот полный XSLT

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
   <xsl:output method="xml" indent="yes"/>
   <xsl:key name="fruit" match="fruit" use="." />

   <xsl:template match="/">
      <xsl:apply-templates 
         select="//fruit[generate-id() = generate-id(key('fruit', .)[1])]" />
   </xsl:template>

   <xsl:template match="@*|node()">
      <xsl:copy>
         <xsl:apply-templates select="@*|node()"/>
      </xsl:copy>
   </xsl:template>
</xsl:stylesheet>

При применении к вашему образцу XML выводится следующее:

<fruit>apple</fruit>
<fruit>Orange</fruit>
<fruit>mango</fruit>
...