2009-07-15 30 views
7

tôi có một loạt các tài liệu xml nơi tác giả đã chọn để đại diện cho một tập hợp các điểm Descartes như thế này:XSLT: Vòng chọn hai yếu tố tại một thời điểm

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

Đây sẽ là bằng với điểm (0, 0) và (1,1).

Tôi muốn viết lại này như

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

Tuy nhiên, tôi không thể tìm ra cách để tạo ra này trong XSLT, trừ hardcoding cho từng trường hợp có thể - ví dụ cho một bộ 4 điểm:

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

Phải có cách nào tốt hơn để thực hiện việc này? Để tóm tắt, tôi muốn tạo các phần tử như <point x="..." y="..."/>, trong đó x và y là các phần tử col chẵn/lẻ được lập chỉ mục.

Trả lời

9

Chắc chắn có một cách chung chung:

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

Output cho tôi:

<set> 
    <point x="0" y="0" /> 
    <point x="1" y="1" /> 
</set> 
Các vấn đề liên quan