2011-12-17 2 views
3

XSLT에서 다음 형식을 렌더링해야합니다. 나는 <xsl:for-each 개의 5 개 요소 (Text1, Text2 ... Text5)를 가지고 있으며 세 요소마다 ul 태그를 감쌀 필요가있다. 어떤 제안을 해주시겠습니까?XSLT 루핑 - <xsl : for-each

<ul> 
    <li>Text1</li> 
    <li>Text2</li> 
    <li>Text3</li> 
</uL> 
<ul> 
    <li>Text4</li> 
    <li>Text5</li> 
</uL> 

답변

4

좋은 질문, +1.

이 변환 :

<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="thing[position() mod 3 = 1]"> 
    <ul> 
    <xsl:apply-templates mode="inGrpoup" select= 
    ".|following-sibling::*[not(position() > 2)]"/> 
    </ul> 
</xsl:template> 

<xsl:template match="thing" mode="inGrpoup"> 
    <li><xsl:value-of select="."/></li> 
</xsl:template> 
<xsl:template match="text()"/> 
</xsl:stylesheet> 

다음과 같은 XML 문서에 적용했을 때 :

<things> 
    <thing>1</thing> 
    <thing>2</thing> 
    <thing>3</thing> 
    <thing>4</thing> 
    <thing>5</thing> 
    <thing>6</thing> 
    <thing>7</thing> 
    <thing>8</thing> 
</things> 

가 (연속 세 그룹으로 일) 원하는, 올바른 결과을 생성합니다

<ul> 
    <li>1</li> 
    <li>2</li> 
    <li>3</li> 
</ul> 
<ul> 
    <li>4</li> 
    <li>5</li> 
    <li>6</li> 
</ul> 
<ul> 
    <li>7</li> 
    <li>8</li> 
</ul> 

설명thing 요소 그룹의 제 thing 일치

  1. 템플릿 패턴. (초기 시동 thing의 처리와는 다른 방법으로) thing 요소 그룹을 처리하는 방식을 사용

  2. 가 한번 결정 하였다.

2

흥미로운 질문입니다. 아래에 하나의 솔루션을 개설했습니다.이 모듈은 <xsl:key>을 사용하여 모듈 식 산술을 사용하여 각 그룹을 식별합니다.

입력 문서 :

<TestDocument> 
    <Element>Alpha</Element> 
    <Element>Bravo</Element> 
    <Element>Charlie</Element> 
    <Element>Delta</Element> 
    <Element>Echo</Element> 
    <Element>Foxtrot</Element> 
    <Element>Golf</Element> 
    <Element>Hotel</Element> 
</TestDocument> 

스타일 시트 :

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

    <!-- Declare a key to identify each group of 3 elements --> 
    <xsl:key name="positionKey" match="/TestDocument/Element" use="floor((position() - 2) div 3)"/> 
    <xsl:template match="/TestDocument"> 
     <html> 
      <!-- Iterate over the first element in each group --> 
      <xsl:for-each select="Element[(position() - 1) mod 3 = 0]"> 
       <ul> 
        <!-- Grab all elements from this group --> 
        <xsl:apply-templates select="key('positionKey', position()-1)"/> 
       </ul> 
      </xsl:for-each> 
     </html> 
    </xsl:template> 

    <xsl:template match="Element"> 
     <li><xsl:value-of select="."/></li> 
    </xsl:template> 
</xsl:stylesheet> 

결과 :

<html> 
    <ul> 
     <li>Alpha</li> 
     <li>Bravo</li> 
     <li>Charlie</li> 
    </ul> 
    <ul> 
     <li>Delta</li> 
     <li>Echo</li> 
     <li>Foxtrot</li> 
    </ul> 
    <ul> 
     <li>Golf</li> 
     <li>Hotel</li> 
    </ul> 
</html>