2009-07-15 48 views
7

我有一堆XML文檔,其中作者選擇代表這樣的一組笛卡爾點選擇兩個元素:XSLT:迴路在時刻

<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, 0)和(1,1)。

我想改寫這個作爲

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

但是,我無法弄清楚如何在XSLT比硬編碼爲每個可能的情況下創建這個,其他 - 例如用於4點集:

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

必須有更好的方法來做到這一點? 總之,我想創建像<point x="..." y="..."/>這樣的元素,其中x和y是偶數/奇數索引col元素。

回答

9

肯定有一個通用的方法:

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

輸出對我來說:

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