2015-12-04 4 views
1

Я пытаюсь удалить элементы с одинаковыми HREF атрибута формируют этот файл:XSLT удалить дубликаты элементов

<?xml version="1.0" encoding="UTF-8"?> 
<images> 
    <item id="d1e152_1" href="Pic/104764.jpg" media-type="image/jpeg"/> 
    <item id="d1e163_2" href="Pic/104764.jpg" media-type="image/jpeg"/> 
    <item id="d1e174_3" href="Pic/104764.jpg" media-type="image/jpeg"/> 
    <item id="d1e218_4" href="Pic/104763.jpg" media-type="image/jpeg"/> 
    <item id="d1e349_5" href="Pic/110001.tif" media-type="image/tif"/> 
    <item id="d1e681_6" href="Pic/199201.tif" media-type="image/tif"/> 
    <item id="d1e688_7" href="Pic/124566.tif" media-type="image/tif"/> 
</images> 

используя этот XSLT 2.0 таблицы стилей

<?xml version="1.0" encoding="UTF-8"?> 
<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:fo="http://www.w3.org/1999/XSL/Format" xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:fn="http://www.w3.org/2005/xpath-functions" exclude-result-prefixes="fn xs fo"> 

<xsl:output method="xml"/> 

<xsl:strip-space elements="*"/> 

<xsl:template match="/images"> 
<new_images> 
    <xsl:apply-templates/> 
    </new_images> 
</xsl:template> 

<xsl:template match="item"> 
<xsl:for-each-group select="." group-by="@href"> 
    <xsl:copy-of select="current-group()[1]"/> 
</xsl:for-each-group> 
</xsl:template> 

</xsl:stylesheet> 

Ожидаемый результат здесь:

<?xml version="1.0" encoding="UTF-8"?> 
<new_images> 
    <item id="d1e152_1" href="Pic/104764.jpg" media-type="image/jpeg"/> 
    <item id="d1e218_4" href="Pic/104763.jpg" media-type="image/jpeg"/> 
    <item id="d1e349_5" href="Pic/110001.tif" media-type="image/tif"/> 
    <item id="d1e681_6" href="Pic/199201.tif" media-type="image/tif"/> 
    <item id="d1e688_7" href="Pic/124566.tif" media-type="image/tif"/> 
</new_images> 

Почему он не работает? У меня все еще есть дубликаты в сгенерированном файле xsl.

ответ

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:key name="kByHref" match="item" use="@href"/> 

    <xsl:template match="/*"> 
    <new_images> 
     <xsl:copy-of select= 
     "*[generate-id() = generate-id(key('kByHref', @href)[1])]"/> 
    </new_images> 
    </xsl:template> 
</xsl:stylesheet> 
+0

Спасибо большое !!! – user3813234

+0

@ пользователь3813234, добро пожаловать. –

1

я получил его .... случается со мной все время ... надо ставить на-каждый-группы в шаблоне/изображений ...

Изменено XSLT 2.0 ...

<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:fo="http://www.w3.org/1999/XSL/Format" xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:fn="http://www.w3.org/2005/xpath-functions" exclude-result-prefixes="fn xs fo"> 

    <xsl:output method="xml"/> 

    <xsl:strip-space elements="*"/> 

    <xsl:template match="/images"> 
    <new_images> 
     <xsl:for-each-group select="item" group-by="@href"> 
     <xsl:copy-of select="current-group()[1]"/> 
     </xsl:for-each-group> 
    </new_images> 
    </xsl:template> 

</xsl:stylesheet> 
+0

user3813234, Существует ** XSLT 1.0 ** решение, которое короче, значительно проще и по меньшей мере столь же эффективным, как XSLT 2.0 решение t hat использует '' - см. мой ответ. –