2011-03-22 4 views
1

는 XML :XSLT 및 테이블 : 행의 셀의 수를 설정

<data> 
    <table id="returns"> 
     <each> 
      <name>1 year</name> 
      <value>17.01062531999216</value> 
     </each> 
     <each> 
      <name>3 years</name> 
      <value>18.01062531999216</value> 
     </each> 
     <each> 
      <name>5 years</name> 
      <value>21.01062531999216</value> 
     </each> 
     <each> 
      <name>Since inception</name> 
      <value>12.01062531999216</value> 
     </each> 
    </table> 
</data> 

내가 시도 된 XSL :

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
    <xsl:template match="/"> 
     <tr> 
      <xsl:for-each select="data/table[@id='returns']/each"> 
       <td><xsl:value-of select="name"/></td> 
       <td><xsl:value-of select="value"/></td> 
       <xsl:if test="//each[position() mod 2 = 0]"> 
        <xsl:text disable-output-escaping="yes"></tr><tr></xsl:text> 
       </xsl:if> 
      </xsl:for-each> 
     </tr> 
    </xsl:template> 
</xsl:stylesheet> 

내가 원하는 그 결과

<table> 
    <tr> 
     <td>1 year</td> 
     <td>17.01062531999216</td> 
     <td>3 years</td> 
     <td>18.01062531999216</td> 
    </tr> 
    <tr> 
     <td>5 years</td> 
     <td>21.01062531999216</td> 
     <td>Since inception</td> 
     <td>12.01062531999216</td> 
    </tr> 
</table> 

내가 얼마나 오랫동안이 일을하고 있는지 말할 때 당혹 스럽다. 무자비한 힘, try-everything-multiple-times 기술은 효과가 없었습니다.

+0

좋은 질문, +1. 지금까지 유일하고 정확한 해결책을 찾았습니다. :) –

답변

0

행당 2 개의 셀을 렌더링합니다.

첫 번째 노드부터 시작하여 모든 두 번째 노드를 선택하십시오. 이를 위해 self와 다음 셀을 포함하는 행을 렌더링하십시오. 마지막 행에 2 each 요소가 없으면 빈 셀을 사용하여 행을 완성합니다.

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

    <xsl:output indent="yes"/> 

    <xsl:template match="table"> 
     <table> 
      <xsl:apply-templates select="each[1 = position() mod 2]"/> 
     </table> 
    </xsl:template> 


    <xsl:template match="each"> 
     <tr> 
      <xsl:for-each select=". | following-sibling::each[1]" > 
       <td><xsl:value-of select="name"/></td> 
       <td><xsl:value-of select="value"/></td> 
      </xsl:for-each> 
      <xsl:if test="not(following-sibling::each)"> 
       <td/> 
       <td/> 
      </xsl:if> 
     </tr> 
    </xsl:template> 

</xsl:stylesheet> 
+0

이 솔루션의 주요 문제점은 원하는 결과를 내지 못한다는 것입니다. –

+0

이것은 저에게 효과적입니다. – dylanmac

1

짧고 정확한 용액 :

<data> 
    <table id="returns"> 
     <each> 
      <name>1 year</name> 
      <value>17.01062531999216</value> 
     </each> 
     <each> 
      <name>3 years</name> 
      <value>18.01062531999216</value> 
     </each> 
     <each> 
      <name>5 years</name> 
      <value>21.01062531999216</value> 
     </each> 
     <each> 
      <name>Since inception</name> 
      <value>12.01062531999216</value> 
     </each> 
    </table> 
</data> 

원하는 정확한 결과 :이 변환은 제공된 XML 문서에 적용

<xsl:stylesheet version="1.0" 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
<xsl:output omit-xml-declaration="yes" indent="yes"/> 
<xsl:strip-space elements="*"/> 

<xsl:template match="table"> 
    <table> 
    <xsl:apply-templates/> 
    </table> 
</xsl:template> 
<xsl:template match="each[position() mod 2 = 1]"> 
    <tr> 
    <xsl:apply-templates select="(.|following-sibling::each[1])/*"/> 
    </tr> 
</xsl:template> 

<xsl:template match="name|value"> 
    <td><xsl:apply-templates/></td> 
</xsl:template> 

<xsl:template match="each[position() mod 2 = 0]"/> 
</xsl:stylesheet> 

생산됩니다 :

<table> 
    <tr> 
     <td>1 year</td> 
     <td>17.01062531999216</td> 
     <td>3 years</td> 
     <td>18.01062531999216</td> 
    </tr> 
    <tr> 
     <td>5 years</td> 
     <td>21.01062531999216</td> 
     <td>Since inception</td> 
     <td>12.01062531999216</td> 
    </tr> 
</table> 
+0

흠, 이것은 나를 위해 작동하지 않습니다. 몇 가지 배경 : 나는 클라이언트 측 XSL을하고 있으며 jQuery 플러그인을 사용하여 HTML 페이지로 변환을 작성하고있다. 그게 중요한지는 모르겠지만이 솔루션은 아무 것도 출력하지 않습니다. – dylanmac

+0

+1 클래식 풀 스타일 응답. –

+0

@ user184051 : 이것은 작동합니다. 테스트 해. 그것은 다른 사람이하는 논리가 아니며 그렇지 않습니다. –

관련 문제