ThomasM: Elemente in zwei "Ästen" des Ergebnisbaums erzeugen

Beitrag lesen

Hallo Frederik,

Dabei können eben beliebig viele image-Elemente auftreten, es soll aber nur ein defs-Element geben. Wenn ich jetzt ein template auf image anwende, kann ich das filter-Element nicht in ein bestehendes defs-Element schreiben. Oder doch?

Ich weiß nicht, ob ich das richtig verstanden habe -- mal ein Versuch unter der Annahme dieses XML-Dokuments:

<?xml version="1.0" encoding="ISO-8859-1"?>  
<root>  
  <image href="test1.png" saturation="40"></image>  
  <image href="test2.png" saturation="50"></image>  
  <image href="test3.png" saturation="60"></image>  
</root>

XSL-Stylesheet:

<?xml version="1.0" encoding="ISO-8859-1"?>  
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">  
  <xsl:output method="xml" version="1.0" encoding="ISO-8859-1" media-type="image/svg+xml" indent="yes"/>  
  <xsl:template match="root">  
    <svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">  
      <defs>  
        <xsl:for-each select="image">  
          <filter id="xyz{position()}">  
            verarbeite saturation <xsl:value-of select="@saturation"/> ...  
          </filter>  
        </xsl:for-each>  
      </defs>  
      <xsl:for-each select="image">  
        <image xlink:href="{@href}" filter="url(#xyz{position()})"/>  
      </xsl:for-each>  
    </svg>  
  </xsl:template>  
</xsl:stylesheet>

SVG-Ergebnis:

<?xml version="1.0" encoding="ISO-8859-1"?>  
<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">  
 <defs>  
  <filter id="xyz1">  
      verarbeite saturation 40 ...  
    </filter>  
  <filter id="xyz2">  
      verarbeite saturation 50 ...  
    </filter>  
  <filter id="xyz3">  
      verarbeite saturation 60 ...  
    </filter>  
 </defs>  
 <image xlink:href="test1.png" filter="url(#xyz1)"/>  
 <image xlink:href="test2.png" filter="url(#xyz2)"/>  
 <image xlink:href="test3.png" filter="url(#xyz3)"/>  
</svg>

Grüße,
Thomas