2014-01-23 14 views
0

У меня есть входящего XML, как это:XSLT проверки дубликатов значений

<comm> 
<source id ="1">TV</source> 
<source id ="2">Radio</source> 
<source id ="3">TV</source> 
<source id ="4">Computer</source> 
</comm> 

Мне нужен XSLT, чтобы сделать выходной XML так:

<comm> 
<type id ="1">TV</source> 
<type id ="2">Radio</source> 
<type id ="4">Computer</source> 
</comm> 

в основном я хочу, чтобы XSLT пройти каждый <source> элемент и создать элемент <type>. Но если значение элемента <type> уже существует, XSLT пропустит создание элемента. В качестве примера, если вы посмотрите на входящий XML, значение «TV» появляется дважды; поэтому XSLT будет создавать элемент со значением TV только один раз.

Мне сложно понять это. Я использую XSLT 2.0.

Я попытался сделать это, динамически обновляя переменную, а затем удаляя повторяющиеся значения. Но XSLT не может изменять переменные.

+0

Возможный дубликат [XSLT Удаление дубликатов] (http://stackoverflow.com/questions/5509424/xslt-removing-duplicates) –

ответ

0

Это очень прямолинейно в XSLT 2.0, используя xsl: for-each-group, хотя вам нужно всего лишь выбрать первый элемент в каждой группе.

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

<xsl:for-each-group select="source" group-by="text()"> 

И изменить источник к типа только с помощью простого templte

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

Попробуйте XSLT

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

    <xsl:template match="/*"> 
     <xsl:copy> 
      <xsl:for-each-group select="source" group-by="text()"> 
       <xsl:apply-templates select="."/> 
      </xsl:for-each-group> 
     </xsl:copy> 
    </xsl:template> 

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

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

Обратите внимание на использование identity template, чтобы скопировать существующие элементы.

Прочитать http://www.xml.com/lpt/a/1314 для получения подробной информации о xsl: for-each-group.

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