2009-07-15 27 views
7

Ben yazar böyle kartezyen noktaları kümesi temsil etmek seçti xml belgelerinin bir grup var az iki öğe seçerek: Bu noktalarda (0 eşit olacağınıXSLT: Döngü her seferinde

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

, 0) ve (1,1).

Ben Ancak

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

olarak bu yeniden yazmak istiyorum, ben her olası durum için tek kodlamak dışında, XSLT'de bu nasıl oluşturulacağını anlamaya olamaz - örneğin 4 noktalı kümesi için:

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

Bunu yapmanın daha iyi bir yolu olmalı? Özetlemek gerekirse, <point x="..." y="..."/> gibi öğeleri oluşturmak istiyorum; burada x ve y eşit/tek dizinli col öğeleridir.

cevap

9

genel bir yolu vardır Emin: Benim için

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

Çıktı:

<set> 
    <point x="0" y="0" /> 
    <point x="1" y="1" /> 
</set> 
İlgili konular