2009-07-15 13 views
7

Ho un mucchio di documenti XML in cui l'autore ha scelto di rappresentare un insieme di punti cartesiani in questo modo:XSLT: Loop selezionando due elementi alla volta

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

Questo sarebbe pari ai punti (0, 0) e (1,1).

Voglio riscrivere questo come

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

Tuttavia, non riesco a capire come creare questo in XSLT, oltre hardcoding per ogni caso possibile - ad esempio per un set a 4 punti:

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

Ci deve essere un modo migliore per farlo? Per riepilogare, voglio creare elementi come <point x="..." y="..."/>, dove x e y sono gli elementi col indicizzati pari/dispari.

risposta

9

che ci sia un modo generico:

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

Uscita per me:

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