2012-10-01 3 views
1

최근에 XSLT로 작업했지만 지금은 새로운 xml 파일을 그룹화하려는 새로운 문제가 발생했습니다. 그룹화에 범위를 지정하는 방법을 알아낼 수 없습니다. 모든 <Info> 노드 내부에 <Detail>을 그룹화하려고합니다. 간단한 샘플 파일 : 출력 내가 <Info> 요소의 값을 복사하는 방법을 모르는 내 시도에서각 형제를위한 XSLT 그룹화 자식 노드

<?xml version="1.0" encoding="utf-8"?> 
<File> 
    <Info> 
    <Id>1111</Id> 
    <Detail type="A" group="1" > 
    <Data> 
     <Nr>1</Nr> 
    </Data> 
    <Data> 
     <Nr>2</Nr> 
    </Data> 
     <Data> 
     <Nr>6</Nr> 
    </Data> 
    </Detail> 
    <Detail type="B" group="1"> 
    <Data> 
     <Nr>3</Nr> 
    </Data> 
    <Data> 
     <Nr>4</Nr> 
    </Data> 
    </Detail> 
    <Detail type="B" group="2"> 
    <Data> 
     <Nr>5</Nr> 
    </Data> 
    </Detail> 
</Info> 
<Info> 
    <Id>2222</Id> 
    <Detail type="A" group="1" > 
     <Data> 
     <Nr>1</Nr> 
     </Data> 
      <Data> 
     <Nr>3</Nr> 
     </Data> 
    </Detail> 
    <Detail type="B" group="1"> 
     <Data> 
     <Nr>2</Nr> 
     </Data> 
    </Detail> 
    </Info> 
</File> 

해야

<?xml version="1.0" encoding="utf-8"?> 
<File> 
    <Info> 
    <Id>1111</Id> 
    <Detail type="A" group="1" > 
    <Data> 
     <Nr>1</Nr> 
    </Data> 
    <Data> 
     <Nr>2</Nr> 
    </Data> 
    </Detail> 
    <Detail type="B" group="1"> 
    <Data> 
     <Nr>3</Nr> 
    </Data> 
    <Data> 
     <Nr>4</Nr> 
    </Data> 
    </Detail> 
    <Detail type="B" group="2"> 
    <Data> 
     <Nr>5</Nr> 
    </Data> 
    </Detail> 
    <Detail type="A" group="1"> 
    <Data> 
     <Nr>6</Nr> 
    </Data> 
    </Detail> 
</Info> 
<Info> 
    <Id>2222</Id> 
    <Detail type="A" group="1" > 
     <Data> 
     <Nr>1</Nr> 
     </Data> 
    </Detail> 
    <Detail type="B" group="1"> 
     <Data> 
     <Nr>2</Nr> 
     </Data> 
    </Detail> 
    <Detail type="A" group="1"> 
     <Data> 
     <Nr>3</Nr> 
     </Data> 
    </Detail> 
    </Info> 
</File> 

(ID를, 너무 다른 요소가 될 수있다) 방금 <Info> 요소를 작성하고 모든 <Detail>은 첫 번째 <Info> 요소에 그룹화되고 마지막 요소는 <Info> 요소는 비워 둡니다. 여기

지금까지

<?xml version="1.0" encoding="UTF-8"?> 
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0"> 

    <xsl:key name="details" match="Detail" 
      use="concat(@type,'_',@group)"/> 
    <xsl:template match='/'> 
    <File> 
     <xsl:for-each select="File/Info"> 
     <Info> 
     <xsl:for-each select="Detail[count(. | key('details', concat(@type,'_',@group))[1]) = 1]"> 
     <xsl:sort select="concat(@type,'_',@group)" /> 
     <Detail type="{@type}" group="{@group}"> 
      <xsl:for-each select="key('details', concat(@type,'_',@group))"> 
      <xsl:copy-of select="Data"/> 
      </xsl:for-each> 
     </Detail> 
     </xsl:for-each> 
     </Info> 
     </xsl:for-each> 
    </File> 
    </xsl:template> 
</xsl:stylesheet> 

내 XSLT이며, 여기에 지금까지

<File> 
    <Info> 
    <Detail type="A" group="1"> 
     <Data> 
     <Nr>1</Nr> 
     </Data> 
     <Data> 
     <Nr>2</Nr> 
     </Data> 
     <Data> 
     <Nr>6</Nr> 
     </Data> 
     <Data> 
     <Nr>1</Nr> 
     </Data> 
     <Data> 
     <Nr>3</Nr> 
     </Data> 
    </Detail> 
    <Detail type="B" group="1"> 
     <Data> 
     <Nr>3</Nr> 
     </Data> 
     <Data> 
     <Nr>4</Nr> 
     </Data> 
     <Data> 
     <Nr>2</Nr> 
     </Data> 
    </Detail> 
    <Detail type="B" group="2"> 
     <Data> 
     <Nr>5</Nr> 
     </Data> 
    </Detail> 
    </Info> 
    <Info /> 
</File> 

감사합니다 도움 :

답변

0

이 변환 내 결과입니다

<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:key name="kDetailChildren" match="Detail" 
    use="concat(generate-id(..),'+',@type,'+',@group)"/> 

<xsl:template match="node()|@*"> 
    <xsl:copy> 
     <xsl:apply-templates select="node()|@*"/> 
    </xsl:copy> 
</xsl:template> 

<xsl:template match= 
"Detail 
    [not(generate-id() 
     = 
     generate-id(key('kDetailChildren', 
         concat(generate-id(..),'+',@type,'+',@group) 
         )[1]) 
     )]"/> 
<xsl:template match="Detail"> 
    <Detail> 
    <xsl:apply-templates select="@*"/> 
    <xsl:apply-templates select= 
    "key('kDetailChildren', 
     concat(generate-id(..),'+',@type,'+',@group) 
     )/node()"/> 
    </Detail> 
</xsl:template> 
</xsl:stylesheet> 

제공되는 XML 문서에 적용 :

<File> 
    <Info> 
     <Id>1111</Id> 
     <Detail type="A" group="1"> 
     <Data> 
      <Nr>1</Nr> 
     </Data> 
     <Data> 
      <Nr>2</Nr> 
     </Data> 
     <Data> 
      <Nr>6</Nr> 
     </Data> 
     </Detail> 
     <Detail type="B" group="1"> 
     <Data> 
      <Nr>3</Nr> 
     </Data> 
     <Data> 
      <Nr>4</Nr> 
     </Data> 
     </Detail> 
     <Detail type="B" group="2"> 
     <Data> 
      <Nr>5</Nr> 
     </Data> 
     </Detail> 
    </Info> 
    <Info> 
     <Id>2222</Id> 
     <Detail type="A" group="1"> 
     <Data> 
      <Nr>1</Nr> 
     </Data> 
     <Data> 
      <Nr>3</Nr> 
     </Data> 
     </Detail> 
     <Detail type="B" group="1"> 
     <Data> 
      <Nr>2</Nr> 
     </Data> 
     </Detail> 
    </Info> 
</File> 

설명 :의

  1. 적절한 사용

    <File> 
        <Info> 
         <Id>1111</Id> 
         <Detail type="A" group="1" > 
          <Data> 
           <Nr>1</Nr> 
          </Data> 
          <Data> 
           <Nr>2</Nr> 
          </Data> 
         </Detail> 
         <Detail type="B" group="1"> 
          <Data> 
           <Nr>3</Nr> 
          </Data> 
          <Data> 
           <Nr>4</Nr> 
          </Data> 
         </Detail> 
         <Detail type="B" group="2"> 
          <Data> 
           <Nr>5</Nr> 
          </Data> 
         </Detail> 
         <Detail type="A" group="1"> 
          <Data> 
           <Nr>6</Nr> 
          </Data> 
         </Detail> 
        </Info> 
        <Info> 
         <Id>2222</Id> 
         <Detail type="A" group="1" > 
          <Data> 
           <Nr>1</Nr> 
          </Data> 
         </Detail> 
         <Detail type="B" group="1"> 
          <Data> 
           <Nr>2</Nr> 
          </Data> 
         </Detail> 
         <Detail type="A" group="1"> 
          <Data> 
           <Nr>3</Nr> 
          </Data> 
         </Detail> 
        </Info> 
    </File> 
    

    이 원하는 정확한 결과를 생성 신원 규칙Muenchian 복합 키를 사용한 그룹화 방법.

  2. 부모의 신원이 키에 어떻게 포함되어 있는지주의하십시오.

+0

좋은 답변을 주셔서 감사합니다. 실제 형식으로 다시 사용하면 문제가 없습니다. 이제는 흐름을 이해하는 데 약간의 시간을 할애 할 것입니다. – user1663498

+0

@ user1663498, 안녕하세요. –