puntila: Vergleich/Update zweier XML-Dateien mittels XSLT

Hallo!

Ich suche mit XSLT eine Vergleich/Update-Routine.

file1:
<?xml version="1.0" encoding="utf-8"?>
<Root>
  <Element id="1">
    file 1 --- Inhalt 1
  </Element>
  <Element id="3">
    file 1 --- Inhalt 3
  </Element>
  <Element id="4">
    file 1 --- Inhalt 4
  </Element>
</Root>

file2:
<?xml version="1.0" encoding="utf-8"?>
<Root>
  <Element id="1">
    file 2 --- Inhalt 1
  </Element>
  <Element id="2">
    file 2 --- Inhalt 2
  </Element>
</Root>

Durch XSLT erzeugter Output:
<?xml version="1.0" encoding="UTF-8"?>
<Root>
  <Element id="1">
    file 1 --- Inhalt 1
    file 2 --- Inhalt 1
  </Element>
  <Element id="2">
    file 2 --- Inhalt 2
    <flag nur-in="file2"/>
  </Element>
  <Element id="3">
    file 1 --- Inhalt 3
    <flag nur-in="file1"/>
  </Element>
  <Element id="4">
    file 1 --- Inhalt 4
    <flag nur-in="file1"/>
  </Element>
</Root>

Die Frage ist: welche XSL-Datei erzeugt mittels file1 und file2 diesen Output?

Puntila

  1. Hallo puntila,

    Die Frage ist: welche XSL-Datei erzeugt mittels file1 und file2 diesen Output?

    Als Ansatz zum Weiterdenken:

    <?xml version="1.0" encoding="UTF-8"?>  
    <xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"  
      xmlns:fn="http://www.w3.org/2005/xpath-functions" exclude-result-prefixes="fn">  
      
      <xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/>  
      
      <xsl:template match="/">  
      
        <xsl:variable name="file1" select="fn:doc('file1.xml')"/>  
        <xsl:variable name="file2" select="fn:doc('file2.xml')"/>  
      
        <Root>  
          <xsl:for-each-group select="$file1//Element union $file2//Element" group-by="@id">  
            <xsl:sort select="@id" data-type="number" order="ascending"/>  
            <Element id="{@id}">  
              <xsl:for-each select="current-group()">  
                <xsl:value-of select="."/>  
              </xsl:for-each>  
            </Element>  
          </xsl:for-each-group>  
        </Root>  
      
      </xsl:template>  
      
    </xsl:stylesheet>
    

    Ergebnis:

    <?xml version="1.0" encoding="UTF-8"?>  
    <Root>  
      <Element id="1">  
        file 1 --- Inhalt 1  
      
        file 2 --- Inhalt 1  
      </Element>  
    	<Element id="2">  
        file 2 --- Inhalt 2  
      </Element>  
    	<Element id="3">  
        file 1 --- Inhalt 3  
      </Element>  
    	<Element id="4">  
        file 1 --- Inhalt 4  
      </Element>  
    </Root>
    

    Grüße,
    Thomas