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

Beitrag lesen

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>

  
Genau so meinte ich es. :-)  
  

> XSL-Stylesheet:  
>   
> ~~~xml

<?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>

Ich habe die ganze Zeit an generate-id() gedacht und mich gefragt, wie ich an zwei Stellen auf die ID zurückgreifen kann. Aber natürlich ist es viel einfacher (und im Ergebnis auch leserlicher), über position() eine ID zu erzeugen.

Jetzt können aber image-Elemente auch in geschachtelten Strukturen auftauchen, so dass ich zwar bei den defs mit xsl:for-each arbeiten kann, bei den images selbst aber ein template mit match verwenden müsste. position() gibt mir dann ja jeweils nur den Platz im aktuellen Knotenset zurück, da kann es also zu Doppelungen kommen, oder?

Ließe sich das vielleicht mit xsl:number lösen?

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>

  
So soll es prinzipiell aussehen, aber es sind eben auch geschachtelte Strukturen möglich.  
  
Danke aber schon mal für den Hinweis, ich denke, das geht in die richtige Richtung. Damit werde ich sicherlich irgendwie zum Ziel kommen.  
  
Liebe Grüße  
Frederik