2016-09-29 7 views
0

나는 다음과 같은 트리 구조를 가진 XML 파일을 가지고 : 당신이 요소에서는 foo2 푸의 자식 요소하지 않습니다 볼 수 있지만 수 있듯이xslt에서 자식 요소가 아닌 요소를 그룹화 할 수있는 방법이 있습니까?

<foo attr1=""/> 
<foo2 num="1"/> 
<foo2 num="2"/> 
<foo2 num="3"/> 
<foo2 num="4"/> 
<foo attr1=""/> 
<foo2 num="1"/> 
... 

난에 그룹에서는 foo2의 NUM = "1"을 통해 싶습니다 num = "4"첫 번째 오류 발생. 어떤 것도 참조로 사용할 수있는 아무 것도 속성이 없습니다 ...

xsl을 사용하여 이것을 달성 할 수있는 방법이 있습니까?

모든 foo의 발생을 쉽게 반복 할 수 있었지만 (xsl : for-each 속성 사용) 까다로운 부분은 각 foo 루프에 대해 다음과 같은 foo2 요소를 포함하는 것입니다.

편집 : 은 ATTR 척하자가있는 임의의 값과 같은 : 내가 뭘 원하는 그룹 ABC는 다음과 같은 foo는의 테이블에 있도록

<foo attr1="abc"/> 
<foo2 num="1"/> 
<foo2 num="2"/> 
<foo2 num="3"/> 
<foo2 num="4"/> 
<foo attr1="def"/> 
<foo2 num="1"/> 

:

+--------+-----+ 
| abc | def | 
| 1  | 1 | 
| 2  |  | 
| 3  |  | 
| 4  |  | 
+--------------+ 

없음 불행히도 xslt 2.0을 지원하지 않습니다.

+0

** 1 ** 귀하의 질문은 완전히 명확하지 않다. 예상되는 출력을 보여주십시오. ** 2. ** 귀하의 프로세서가 XSLT 2.0을 지원합니까? –

+0

@ michael.hor257k 방금 내 글을 업데이트했습니다. – Mnemonics

답변

1

현재 두 개의 별도의 문제가 :

  1. 방법 그룹 노드를, XSLT 2.0의 group-starting-with의 동등한를 사용하는; HTML 테이블이 행 단위을 구성하더라도 - 각 그룹이 을 차지하는 테이블을 구축 할 수 있도록

  2. 방법, (피벗) 결과 트랜스합니다.

    XSLT 다음 예제 입력에 적용 1.0

    <xsl:stylesheet version="1.0" 
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
    xmlns:exsl="http://exslt.org/common" 
    extension-element-prefixes="exsl"> 
    <xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/> 
    
    <xsl:key name="grp" match="foo2" use="generate-id(preceding-sibling::foo[1])" /> 
    
    <!-- first-pass --> 
    <xsl:variable name="groups-rtf"> 
        <xsl:for-each select="root/foo"> 
         <group name="{@attr1}"> 
          <xsl:for-each select="key('grp', generate-id())"> 
           <item><xsl:value-of select="@num"/></item> 
          </xsl:for-each> 
         </group> 
        </xsl:for-each> 
    </xsl:variable> 
    <xsl:variable name="groups" select="exsl:node-set($groups-rtf)/group" /> 
    
    <xsl:template match="/"> 
        <table border="1"> 
         <!-- header row --> 
         <tr> 
          <xsl:for-each select="$groups"> 
           <th><xsl:value-of select="@name"/></th> 
          </xsl:for-each> 
         </tr>  
         <!-- data rows --> 
         <xsl:call-template name="generate-rows"/> 
        </table> 
    </xsl:template> 
    
    <xsl:template name="generate-rows"> 
        <xsl:param name="i" select="1"/> 
        <xsl:if test="$groups/item[$i]"> 
         <tr> 
          <xsl:for-each select="$groups"> 
           <td><xsl:value-of select="item[$i]"/></td> 
          </xsl:for-each> 
         </tr> 
         <xsl:call-template name="generate-rows"> 
          <xsl:with-param name="i" select="$i + 1"/> 
         </xsl:call-template> 
        </xsl:if> 
    </xsl:template> 
    
    </xsl:stylesheet> 
    

    :

나는 당신이 두 개의 패스에서 이렇게 제안

XML

<root> 
    <foo attr1="abc"/> 
    <foo2 num="1"/> 
    <foo2 num="2"/> 
    <foo2 num="3"/> 
    <foo2 num="4"/> 
    <foo attr1="def"/> 
    <foo2 num="5"/> 
    <foo2 num="6"/> 
</root> 

제 (렌더링) 결과는 다음과 같습니다.

enter image description here

관련 문제