2016-07-14 21 views
0

Ich habe eine große XML-Datei, wo Personen mit einem identifizierenden Wert zugeordnet werden. Eine vereinfachte Version wäre:etwas tun, wenn Attributwert ist Singular

<start> 
<text 1> 
    <person key="A00001">Adam Ant</person> 
    <person key="A00001">Mr. A.</person> 
</text 1> 
<text 2> 
    <poem> 
    <person key="A00002">Mrs. Bee</person> 
    <person key="A00003">Cecily</person> 
    <person key="A00001">A.</person> 
    </poem> 
</text 2> 
</start> 

Ich versuche, die Personen zu bestimmen, bei denen der Wert schlüssel Exits nur einmal im gesamten Dokument. Ich denke, die Lösung hat mit generate-id (.) Zu tun, aber ich bin mir nicht sicher. Wie könnte ich XSLT verwenden, um A00002 und A00003 als Ausgabe zu haben?

(XSLT 2.0)

Antwort

1

Verwenden Sie ein Schlüssel <xsl:key name="group" match="person/@key" use="."/> und dann berechnen distinct-values(//person/@key)[not(key('group', .)[2])] nur müssen Sie die Wurzel speichern, wie in

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

    <xsl:key name="group" match="person/@key" use="."/> 

    <xsl:variable name="root" select="/"/> 

    <xsl:template match="/"> 
     <xsl:value-of select="distinct-values(//person/@key)[not(key('group', ., $root)[2])]"/> 
    </xsl:template> 
</xsl:stylesheet> 

Als Alternative können Sie natürlich <xsl:for-each-group select="//person/@key" group-by="."><xsl:if test="not(current-group()[2])"><xsl:value-of select="."/></xsl:if></xsl:for-each> nutzen könnten.

Verwandte Themen