2009-07-15 8 views
7

ich eine Reihe von XML-Dokumenten in dem der Autor eine Reihe von kartesischen Punkten wie folgen darstellen gewählt:XSLT: Loop Auswahl von zwei Elementen zu einem Zeitpunkt

<row index="0"> 
    <col index="0">0</col> 
    <col index="1">0</col> 
    <col index="2">1</col> 
    <col index="3">1</col> 
</row> 

Diese auf die Punkte gleich wären (0, 0) und (1,1).

Ich mag dies umschreiben als

<set> 
    <point x="0" y="0"/> 
    <point x="1" y="1"/> 
</set> 

Allerdings kann ich nicht herausfinden, wie dies in XSLT erstellen, die nicht für jeden möglichen Fall hartzucodieren - zum Beispiel für ein 4-Punkt-Set:

<set> 
    <point> 
    <xsl:attribute name="x"><xsl:value-of select="col[@index = 0]"/></xsl:attribute> 
    <xsl:attribute name="y"><xsl:value-of select="col[@index = 1]"/></xsl:attribute> 
    </point> 
    <point> 
    <xsl:attribute name="x"><xsl:value-of select="col[@index = 1]"/></xsl:attribute> 
    <xsl:attribute name="y"><xsl:value-of select="col[@index = 2]"/></xsl:attribute> 
    </point> 
    ... 

Es muss einen besseren Weg geben, dies zu tun? Zusammenfassend möchte ich Elemente wie <point x="..." y="..."/> erstellen, wobei x und y die geradzahligen/ungeradzahligen col Elemente sind.

Antwort

9

Sicher gibt es eine generische Art und Weise:

<xsl:stylesheet 
    version="1.0" 
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
> 

    <xsl:template match="row"> 
    <set> 
     <xsl:apply-templates select=" 
     col[position() mod 2 = 1 and following-sibling::col] 
     " /> 
    </set> 
    </xsl:template> 

    <xsl:template match="col"> 
    <point x="{text()}" y="{following-sibling::col[1]/text()}" /> 
    </xsl:template> 

</xsl:stylesheet> 

Ausgang für mich:

<set> 
    <point x="0" y="0" /> 
    <point x="1" y="1" /> 
</set> 
Verwandte Themen