2012-10-15 4 views
0

변환 (http://stackoverflow.com/questions/12862902/how-to-do-xslt-muenchian-grouping-with-some-null-attributes/12871809#12871809) 속성 (@group)을 기반으로하는 그룹이고 해당 속성은 null입니다. 처음에는 그냥 문자열을 연결하는 것이었지만 지금은 문자열을 파일 위치로 사용하고 그룹화되어있는 경우 문서를 concaten 처리하도록 확장해야합니다 - 그룹화되지 않은 경우 문자열을 파일로 사용해야하지만 ' 다른 어떤 것에도 참여할 필요가 없습니다. ...그룹화 변환의 XSLT Concat HTML 문서

<root> 
<section> 
<subsection> 
    <module> 
     <comp>111</comp> 
    </module> 
    <module group='group01'> 
     <comp>222</comp> 
    </module> 
    <module group='group01'> 
     <comp>333</comp> 
    </module> 
    <module> 
     <comp>444</comp> 
    </module> 
    <module> 
     <comp>555</comp> 
    </module> 
</subsection> 
</section> 
<section> 
<subsection> 
    <module group ="group02"> 
     <comp>666</comp> 
    </module> 
    <module group ="group02"> 
     <comp>777</comp> 
    </module> 
    <module> 
     <comp>888</comp> 
    </module> 
    <module group ="group03"> 
     <comp>999</comp> 
    </module> 
    <module group ="group03"> 
     <comp>101010</comp> 
    </module> 
</subsection> 
<subsection> 
    <module group ="group04"> 
     <comp>11111</comp> 
    </module> 
    <module group ="group04"> 
     <comp>121212</comp> 
    </module> 
    <module group ="group05"> 
     <comp>131313</comp> 
    </module> 
    <module group ="group05"> 
     <comp>141414</comp> 
    </module> 
    <module group ="group06"> 
     <comp>151515</comp> 
    </module> 
    <module group ="group06"> 
     <comp>161616</comp> 
    </module> 
    <module> 
     <comp>171717</comp> 
    </module> 
</subsection> 

이 순간에 변화가 같은 그룹의 경우 약하게 문자열을 concats 일 :

그리고 샘플 입력

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
<xsl:output method="xml" indent="yes"/> 
<xsl:key name="modules" match="module[@group]" use="concat(generate-id(..), '|', @group)"/> 

<xsl:template match="root"> 
    <AllSections> 
     <xsl:apply-templates /> 
    </AllSections> 
</xsl:template> 

<!-- NON GROUPED PART --> 
<xsl:template match="module[not(@group)]"> 
    <page> 
     <content> 
      <xsl:value-of select="comp"/> 
     </content> 
    </page> 
</xsl:template> 

<!--GROUPED PART --> 
<xsl:template match="module[@group][generate-id() = generate-id(key('modules', concat(generate-id(..), '|', @group))[1])]"> 
    <xsl:variable name="modules" select="key('modules', concat(generate-id(..), '|', @group))"/> 
    <page> 
     <content> 
      <xsl:apply-templates select="$modules/comp/text()"/> 
     </content> 
     <count> 
      <xsl:value-of select="count($modules)" /> 
     </count> 
    </page> 
</xsl:template> 

<xsl:template match="module"/> 

<xsl:template match="@*|node()"> 
    <xsl:copy> 
     <xsl:apply-templates select="@*|node()"/> 
    </xsl:copy> 
</xsl:template> 
을 : 변환 이 그룹화되지 않은 부분에 대한 문자열이 파일 위치로 사용됩니다 :

012 순간

그룹화 된 부분이 출력됩니다

...

<page> 
     <content>strgin1string2</content> 
     <count>2</count> 
</page> 

...

I이 필요합니다

...

<page> 
     <content> 
     TEXT FROM FILE CALLED string1 
     TEXT FROM FILE CALLED string2 
     </content> 
     <count>2</count> 
</page> 

...

감사!

+0

이 파일은 XML 파일입니까? XSLT 1.0을 사용하면'document' 함수로 가져올 수있는 것이 모두 XML 문서입니다. XSLT 2.0 만 비 XML 텍스트 파일을 가져올 수있는'unparsed-text'를 가지고 있습니다. –

답변

0

당신은 단순히 당신이

<xsl:template match="module[@group][generate-id() = generate-id(key('modules', concat(generate-id(..), '|', @group))[1])]"> 
    <xsl:variable name="modules" select="key('modules', concat(generate-id(..), '|', @group))"/> 
    <page> 
     <content> 
      <xsl:copy-of select="document($modules/comp)"/> 
     </content> 
     <count> 
      <xsl:value-of select="count($modules)" /> 
     </count> 
    </page> 
</xsl:template> 

[편집]에 코드를 변경할 수 있습니다 완전한 XML 문서에서 끌어 원하는 가정 나는 comp 요소가 전체 URL을 포함하는 경우 내 제안은 위의 작동 생각합니다. 귀하의 의견은 그러나 당신이 <xsl:copy-of select="document($modules/comp/(concat('../line/', .))"/>처럼 컴팩트 한 줄을 쓸 수 XSLT 2.0

<xsl:template match="module[@group][generate-id() = generate-id(key('modules', concat(generate-id(..), '|', @group))[1])]"> 
    <xsl:variable name="modules" select="key('modules', concat(generate-id(..), '|', @group))"/> 
    <page> 
     <content> 
      <xsl:for-each select="$modules/comp"> 
       <xsl:copy-of select="document(concat('../myfile/', .))"/> 
      </xsl:for-each> 
     </content> 
     <count> 
      <xsl:value-of select="count($modules)" /> 
     </count> 
    </page> 
</xsl:template> 

필요하지만, XSLT 1.0로에 대한-각이해야 할 당신이 XSLT 1.0이 경우, 각 comp와 일정을 연결하려는 제안 .

+0

안녕 마틴, 불행히도 - 나는 아직도이 시점에서 템플릿을 호출해야한다고 생각합니다. 위의 경우 파일 위치가 추가 된 상태에서 첫 번째 문서 출력 만 가져옵니다. 카운트가 올라가더라도. 어쩌면 루핑하지만 문서를 추가하지 않을 수 있습니까? – user1738668

+0

후자! 감사. * xslt newb * – user1738668