2013-10-08 4 views
0

커뮤니티에서 엄청난 제안을 한 후 처음으로 여기에 게시하십시오.중첩 된 각 그룹 통화의 증분 자

XSLT 2.0에는 어깨, 무릎, 발가락이 모두 같은 세 개의 필드가 있습니다. 나는 어깨와 무릎의 고유 한 조합에 기초하여 발가락의 합계를 출력해야하므로 두 개의 중첩 된 for-each-groups를 만들었습니다. 각 출력에서 ​​1에서부터 어깨와 무릎의 독특한 조합 수로 증분기를 출력해야합니다.

이 인크 리 멘터는 내가 문제가있는 곳입니다. 가장 가까운 것은 position()을 호출하는 것입니다. 그러나 가장 안쪽 그룹에서 호출하면 각 고유 어깨에서 카운터가 재설정됩니다. 가장 바깥 쪽 그룹에서 호출하면 고유 한 어깨의 모든 무릎이 동일한 값을 얻습니다. 그런 다음 각 고유 한 어깨에서 재설정됩니다. 그룹 외부에서 완전히 호출하면 과거 1이되지 않습니다. 또한 xsl : number, keys 등을 사용하지 않으려 고 시도했습니다. 이 경우 올바른 행 수가 여전히 인쇄되고 있지만 증분 값은 그룹화되지 않은 개별 값을보고 있습니다.

템플릿간에 "터널링"값에 대한 제안을 읽었지 만 템플릿을 올바르게 호출하고 있다고 생각하지 않기 때문에 작동하지 못했습니다. 부모가 아닌 어린이). 각 그룹 또는 다른 사람과 함께이 작업을하는 데 대한 의견이 있으십니까? 미리 감사드립니다.

샘플 XML :

<bodies> 
<parts> 
    <shoulders>shoulders1</shoulders> 
    <knees>knees1</knees> 
    <toes>1</toes> 
</parts> 
<parts> 
    <shoulders>shoulders2</shoulders> 
    <knees>knees2</knees> 
    <toes>2</toes> 
</parts> 
<parts> 
    <shoulders>shoulders1</shoulders> 
    <knees>knees2</knees> 
    <toes>10</toes> 
</parts> 
<parts> 
    <shoulders>shoulders2</shoulders> 
    <knees>knees1</knees> 
    <toes>10</toes> 
</parts> 
<parts> 
    <shoulders>shoulders1</shoulders> 
    <knees>knees1</knees> 
    <toes>9</toes> 
</parts> 
<parts> 
    <shoulders>shoulders2</shoulders> 
    <knees>knees2</knees> 
    <toes>8</toes> 
</parts> 
</bodies> 

샘플 XSLT : 결과

<xsl:stylesheet exclude-result-prefixes="xsl" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="2.0" xmlns:this="urn:this-stylesheet" xmlns:xsd="http://www.w3.org/2001/XMLSchema"> 
    <xsl:template match="/"> 
     <xsl:for-each-group select="bodies/parts" group-by="shoulders"> 
     <xsl:for-each-group select="current-group()" group-by="knees"> 
      <xsl:value-of select="shoulders"/> 
      <xsl:text>, </xsl:text> 
      <xsl:value-of select="knees"/> 
      <xsl:text>, </xsl:text> 
      <xsl:value-of select="sum(current-group()/toes)"/> 
      <xsl:text>, </xsl:text> 
      <xsl:value-of select="position()"/> 
      <xsl:text>. </xsl:text> 
     </xsl:for-each-group> 
     </xsl:for-each-group> 
    </xsl:template> 
</xsl:stylesheet> 

출력 :

shoulders1, knees1, 10, 1 shoulders1, knees2, 10, 2 shoulders2, knees2 , 10, 1. 어깨 2, 무릎 1, 10, 2.

원하는 출력 :

shoulders1, knees1, 10, 1 shoulders1, knees2, 10, 2 shoulders2, knees2, 10, 3 shoulders2, knees1, 10, 4

답변

1

는 다음 대안은 다음과 같이 복합 키를 단일 레벨 그룹을하는 것입니다 :

<xsl:for-each-group select="bodies/parts" group-by="concat(shoulders, '~', knees)"> 

position() 다음 방법을 증가합니다 요구 사항을 올바르게 이해했다면 찾고 있습니다.

실제로 외부 그룹이 중요한 계층 구조로 구성된 출력을 실제로 생성하려는 경우에는 작동하지 않습니다.

0

지금이 세 번 시도하고 나는 생각한다 결과를 처리 한 다음 계산해야합니다. 나는 그것을 할 수 없다고 생각하기 때문에 시간을 다 써서 인라인으로 계산하는 방법을 생각해 냈습니다.

이 같은 두 개의 중첩 xsl:for-each-group 지침을 가지고
<xsl:stylesheet exclude-result-prefixes="xsl" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="2.0" xmlns:this="urn:this-stylesheet" xmlns:xsd="http://www.w3.org/2001/XMLSchema"> 
    <xsl:template match="/"> 
    <xsl:variable name="results" as="xsd:string*"> 
     <xsl:for-each-group select="bodies/parts" group-by="shoulders"> 
     <xsl:for-each-group select="current-group()" group-by="knees"> 
      <xsl:value-of> 
      <xsl:value-of select="shoulders"/> 
      <xsl:text>, </xsl:text> 
      <xsl:value-of select="knees"/> 
      <xsl:text>, </xsl:text> 
      <xsl:value-of select="sum(current-group()/toes)"/> 
      <xsl:text>,</xsl:text> 
      </xsl:value-of> 
     </xsl:for-each-group> 
     </xsl:for-each-group> 
    </xsl:variable> 
    <xsl:for-each select="$results"> 
     <xsl:value-of select=".,position()"/> 
     <xsl:text>. </xsl:text> 
    </xsl:for-each> 
    </xsl:template> 
</xsl:stylesheet>