2010-03-08 3 views
2

xslt 1.0 항목을 그룹화하는 데 어려움이 있습니다. 나는 아래와 같은 소스 XML이 :xslt 1.0의 3 개 항목을 모두 그룹화합니다.

<client name="client A"> 
    <project name = "project A1"/> 
    <project name = "project A2"/> 
    <project name = "project A3"/> 
    <project name = "project A4"/> 
</client> 
<client name="client B"> 
    <project name = "project B1"/> 
    <project name = "project B2"/> 
</client> 
<client name="client C"> 
    <project name = "project C1"/> 
    <project name = "project C2"/> 
    <project name = "project C3"/> 
</client> 

내가 모든 프로젝트를 선택하고자으로 정렬하고 줄을 다음 그룹 아래의 예에서와 같이 하나의 boundle의 모든 3 프로젝트 :

<boundle> 
    <project name="project A1"> 
    <project name="project A2"> 
    <project name="project A3"> 
</boundle> 
<boundle> 
    <project name="project A4"> 
    <project name="project B1"> 
    <project name="project B2"> 
</boundle> 
<boundle> 
    <project name="project C1"> 
    <project name="project C2"> 
    <project name="project C3"> 
</boundle> 

현재 경계 태그를 열고 나중에 닫는 데 사용하고 있습니다. 더 나은 해결책에 대해 생각해 볼 수 있습니까?

답변

4

그룹화는 필요하지 않습니다.

<xsl:param name="perGroup" select="3" /> 

<xsl:variable name="allProjects" select="/client/project" /> 

<xsl:template match="/"> 
    <xsl:apply-templates select="$allProjects" mode="counted" /> 
</xsl:template> 

<xsl:template match="project" mode="counted"> 
    <xsl:if test="position() mod $perGroup = 1"> 
    <xsl:variable name="pos" select="position()" /> 
    <boundle> 
     <xsl:copy-of select="$allProjects[ 
     position() &gt;= $pos and position() &lt; ($pos + $perGroup) 
     ]" /> 
    </boundle> 
    </xsl:template> 
</xsl:template> 
+0

반복을 피하기 때문에이 솔루션이 마음에 듭니다. 궁금한 점이 있다면, 기본적으로 모든 프로젝트를 반복하고 매 3 번째 프로젝트마다 처음 프로젝트를 복사하는 대신 마지막 세 개의 프로젝트를 복사하는 것입니다. – OregonGhost

+1

이것은 훨씬 간단해질 수 없습니다. 당신은''xsl : apply-templates select = "$ allProjects [position() mod 3 = 1]"...'을하고 교환으로''을 제거 할 수 있습니다. 그러나 처리면에서 이것은 거의 같은 것입니다 . 또한, 내가 한 것처럼, ''템플릿 자체가 포함되어 있습니다. XSL 키의 잠재적 인 사용에 관해서 : 프로젝트의 연속적인 범위가 없기 때문에,'position() mod x'는 원하는 결과를 만들어 내지 못할 것입니다. 그 외에도 위의 매개 변수는 XSL 키를 하드 코딩해야합니다. – Tomalak

+0

이 맞습니다. 내 솔루션 작업 (현재 삭제됨)에서 번들의 두 번째 또는 세 번째 프로젝트가 다음 또는 하나의 클라이언트 노드에 추가되는 다른 에지 상황을 다루는 것은 절망적으로 복잡해집니다. – Richard

0

본인은 XML 문서의 내용에 따라 몇 가지 범주로 요소를 그룹화하는 방법 다양한 수를 알아내는 저를 도운 다음 링크 http://www.jenitennison.com/xslt/grouping/을 추천 할 수 있습니다.

+1

사이트가 앞으로 구식이 될 수 있으므로 다른 사이트에 대한 링크 만 대답으로 제공하면 안됩니다. 대신이 답변에서 '수정'링크를 클릭하고 해당 페이지의 솔루션 핵심 부분을 여기에 포함 시키십시오. 참조 : http://meta.stackexchange.com/q/8259 –