Avatar billede agentjna Nybegynder
24. august 2010 - 09:48 Der er 4 kommentarer og
1 løsning

Fjern dubletter

Hej

Jeg har en xml struktur
   
    <AnsvarMail>
        <CcMail>xxx@xxx.dk</CcMail>
    </AnsvarMail>
    <AnsvarMail>
        <CcMail>xxx@xxx.dk</CcMail>
    </AnsvarMail>
    <AnsvarMail>
        <CcMail>yyy@yyy.dk</CcMail>
    </AnsvarMail>
    <AnsvarMail>
        <CcMail>yyy@yyy.dk</CcMail>
    </AnsvarMail>
   
Som jeg gerne vil have skrevet i et element uden dubletter.. med semikolon så det kan sendes til mailserver

    <CcMailListe>xxx@xxx.dk; yyy@yyy.dk</CcMail>

Lykkes mig at skrive det i et element med nedenstående xslt, men kan ikke fjerne dubletterne...

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:fn="http://www.w3.org/2005/xpath-functions">
    <xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/>
    <xsl:template match="//">
        <xsl:copy-of select="."/>
        <xsl:variable name="MailListe">
            <CcMailListe>
                <xsl:variable name="test">
                    <xsl:for-each select="/AnsvarMail">
                        <xsl:value-of select="."/>
                        <xsl:if test="position() != last()">; </xsl:if>
                    </xsl:for-each>
                </xsl:variable>
                <xsl:value-of select="normalize-space($test)"/>
            </CcMailListe>
        </xsl:variable>
        <xsl:copy-of select="($MailListe)"/>
    </xsl:template>
</xsl:stylesheet>


Håber på hjælp.

Hilsen
Jesper
Avatar billede arne_v Ekspert
24. august 2010 - 21:16 #1
Proev denne metode:

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:fn="http://www.w3.org/2005/xpath-functions">
    <xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/>
    <xsl:template match="/">
        <!--<xsl:copy-of select="."/>-->
        <xsl:variable name="MailListe">
            <CcMailListe>
                <xsl:variable name="test">
                    <xsl:for-each select="//AnsvarMail">
                        <xsl:if test="not(node()) or not(preceding-sibling::node()[.=string(current())])">
                            <xsl:value-of select="."/>
                            <xsl:if test="position() != last()">; </xsl:if>
                        </xsl:if>
                    </xsl:for-each>
                </xsl:variable>
                <xsl:value-of select="normalize-space($test)"/>
            </CcMailListe>
        </xsl:variable>
        <xsl:copy-of select="($MailListe)"/>
    </xsl:template>
</xsl:stylesheet>
Avatar billede jokkejensen Novice
02. september 2010 - 00:03 #2
ellers skal foreach bare se sådan her ud for distinct values,

//AnsvarMail[not(CcMail=preceding-sibling::AnsvarMail/CcMail)]/CcMail

Performer også bedre hvis vi taler MEGET store lange email lister.
Avatar billede agentjna Nybegynder
02. september 2010 - 09:09 #3
Tak - det virker rigtig godt

Hilsen
Jesper
Avatar billede jokkejensen Novice
03. september 2010 - 18:34 #4
Så få den lukket ved at bede arne om at svare :) - Fedt at det virker
Avatar billede arne_v Ekspert
03. september 2010 - 18:37 #5
svar fra mig
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester