Janine: Doppelte XML-Knoten identifizieren

Hallo,

ich habe folgendes XML:

<?xml version="1.0" encoding="iso-8859-1"?>
<definitions xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
	<definition>
		<term>
			<de>Life-Cycle</de>
			<en>Life Cycle</en>
		</term>
		<description>
			<de>
				<txt>Deutsche Erklärung</txt>
			</de>
			<en>
				<txt>Englische Erklärung</txt>
			</en>
		</description>
	</definition>
	<definition>
		<term>
			<de>Lebenszyklus</de>
			<en>Life Cycle</en>
		</term>
		<description>
			<de>
				<txt>Deutsche Erklärung</txt>
			</de>
			<en>
				<txt>Englische Erklärung</txt>
			</en>
		</description>
	</definition>
</definitions>

Und ich will aus der Liste der sehr vielen <definition> doppelte Einträge im <term><de> bzw. doppelte Einträge im <term><en> identifizieren und sichtbar machen.

Leider funktioniert mein Code mit dem key() nicht. Habe zwei unterschiedliche Tests für <en> gemacht, beide sinnlos... Vielleicht habt ihr ja eine Ahnung, wo mein Fehler liegt?

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xslt="http://www.w3.org/2005/xpath-functions" exclude-result-prefixes="xs" version="2.0">
	<xsl:output method="xml" encoding="UTF-8"/>
	
	<xsl:key use="de" match="term" name="termkeyde"/>
	<xsl:key use="en" match="term" name="termkeyen"/>
	
	<xsl:template match="/definitions">
		<doubleterms>
			<xsl:if test="definition/term[count(key('termkeyen', en)) &gt; 1]">
				<test1>
					<xsl:value-of select="de/text()"/>
				</test1>
			</xsl:if>
			<xsl:if test="definition/term[generate-id()= generate-id(key('termkeyen',en)[2])]">
				<test2>
					<xsl:value-of select="en/text()"/>
				</test2>
			</xsl:if>
		</doubleterms>
	</xsl:template>
</xsl:stylesheet>

Schonmal besten Dank! Viele Grüße, Janine

akzeptierte Antworten

  1. Hallo Janine,

    bei den Ausgaben fehlt vor de bzw. en noch der Pfad: definition/term/

    Grüße,
    Thomas

    1. Hallo Thomas,

      danke für deine Antwort. Wenn ich den Pfad ergänze: <xsl:value-of select="definition/term/en/text()"/> dann spuckt er mir alle "definition/term/en" aus, die in der Datei existieren. Ich will aber nur die rausbekommen, die doppelt sind (gerne auch unter verschiedenen Elementen), also z.B.

      <doubleterms>
      	<term>
      		<en>Life Cycle</en>
      	</term>
      	<term>
      		<de>anderer doppelter Eintrag in de</de>
      	</term>
      </doubleterms>
      
      1. Ich glaube, ich habe nun die Lösung. Eine Schleife hat gefehlt:

        <?xml version="1.0" encoding="UTF-8"?>
        <xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xslt="http://www.w3.org/2005/xpath-functions" exclude-result-prefixes="xs" version="2.0">
             <xsl:output method="xml" encoding="UTF-8"/>
             
             <xsl:key use="de" match="term" name="termkeyde"/>
             <xsl:key use="en" match="term" name="termkeyen"/>
             
             <xsl:template match="/definitions">
                  <doubleterms>
        							<xsl:for-each select="definition/term">
        									<xsl:if test="generate-id()= generate-id(key('termkeyen',en)[2])">
                            <en>
                                 <xsl:value-of select="en/text()"/>
                            </en>
                       		</xsl:if>
        									<xsl:if test="generate-id()= generate-id(key('termkeyde',de)[2])">
                            <de>
                                 <xsl:value-of select="de/text()"/>
                            </de>
                       		</xsl:if>
        							</xsl:for-each>
                  </doubleterms>
             </xsl:template>
        </xsl:stylesheet>
        

        Danke für den Hinweis, er hat mich zur Lösung geführt 😉

        Grüße, Janine