1

カウント/増分を含めたいグループ化変換があります。グループ化が割り当てられている場合、変換は値をグループ化します。値は、トランスフォームが一緒に結合するために使用するファイルの場所であるため、コンテンツは 1 つとして出力されます。グループ化が割り当てられていない場合、トランスフォームは値を使用してファイルの内容を取得し、何も追加しません。

XSLT:

   <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:variable name="var">
                 <xsl:value-of select="comp"/>
                </xsl:variable>
                <xsl:copy-of select="document(concat('../myfile/', string($var)))"/>
               </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:for-each select="$modules/comp">
                 <xsl:copy-of select="document(concat('../myfile/', .))"/>
                </xsl:for-each>
               </content>

           </page>
       </xsl:template>

       <xsl:template match="module"/>

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

入力:

    <root>
        <section>
            <subsection>
                <module>
                    <comp>aaa.html</comp>
                </module>
                <module group='group01'>
                    <comp>bbb.html</comp>
                </module>
                <module group='group01'>
                    <comp>ccc.html</comp>
                </module>
                <module>
                    <comp>ddd.html</comp>
                </module>
                <module>
                    <comp>eee.html</comp>
                </module>
            </subsection>
        </section>
        <section>
            <subsection>
                <module group ="group02">
                    <comp>fff.html</comp>
                </module>
                <module group ="group02">
                    <comp>ggg.html</comp>
                </module>
                <module>
                    <comp>hhh.html</comp>
                </module>
                <module group ="group03">
                    <comp>iii.html</comp>
                </module>
                <module group ="group03">
                    <comp>jjj.html</comp>
                </module>
            </subsection>
            <subsection>
                <module group ="group04">
                    <comp>kkk.html</comp>
                </module>
                <module group ="group04">
                    <comp>lll.html</comp>
                </module>
                <module group ="group05">
                    <comp>mmm.html</comp>
                </module>
                <module group ="group05">
                    <comp>nnn.html</comp>
                </module>
                <module group ="group06">
                    <comp>ooo.html</comp>
                </module>
                <module group ="group06">
                    <comp>ppp.html/comp>
                </module>
                <module>
                    <comp>qqq.html</comp>
                </module>
            </subsection>
        </section>
    </root>

出力サンプル:

    <?xml version="1.0" encoding="utf-8"?>
    <AllSections>   
        <section>        
            <subsection>            
                <page>
                    <content>
                        CONTENT FROM aaa.html
                    </content>
                </page>            
                <page>
                    <content>
                        CONTENT FROM bbb.html
                        CONTENT FROM ccc.html
                    </content>
                </page>           
                <page>
                    <content>
                        CONTENT FROM ddd.html
                    </content>
                </page>           
                <page>
                    <content>
                        CONTENT FROM eee.html
                    </content>
                </page>            
            </subsection>       
        </section>    
        <section>       
            <subsection>  
                <page>
                    <content>
                        CONTENT FROM fff.html
                        CONTENT FROM ggg.html
                    </content>
                </page>           
                <page>
                    <content>
                        CONTENT FROM hhh.html
                    </content>
                </page>            
                <page>
                    <content>
                        CONTENT FROM iii.html
                        CONTENT FROM jjj.html
                    </content>
                </page>         
            </subsection>        
            <subsection>            
                <page>
                    <content>
                        CONTENT FROM kkk.html
                        CONTENT FROM lll.html
                    </content>
                </page>           
                <page>
                    <content>
                        CONTENT FROM mmm.html
                        CONTENT FROM nnn.html
                    </content>
                </page>           
                <page>
                    <content>
                        CONTENT FROM ooo.html
                        CONTENT FROM ppp.html
                    </content>
                </page>           
                <page>
                    <content>
                        CONTENT FROM qqq.html
                    </content>
                </page>           
            </subsection>       
        </section>    
    </AllSections>

私がやろうとしているのは、セクション AND サブセクション AND にインクリメントを割り当てることに関して、合計ページのカウンターを入れることです。以下を参照してください。param を試しましたが、再帰テンプレートが必要ですか? 変換の残りの部分を壊すために sem だけを入れた場合。テンプレートを使用すると、すでに「ループ」が作成されていませんか?

取得しようとしている出力:

   <AllSections>   
        <section>        
            <subsection>            
                <page>
                    <content>
                        CONTENT FROM aaa.html
                    </content>
                    <page_no>1</page_no>
                </page>            
                <page>
                    <content>
                        CONTENT FROM bbb.html
                        CONTENT FROM ccc.html
                    </content>
                    <page_no>2</page_no>
                </page>           
                <page>
                    <content>
                        CONTENT FROM ddd.html
                    </content>
                    <page_no>3</page_no>
                </page>           
                <page>
                    <content>
                        CONTENT FROM eee.html
                    </content>
                    <page_no>4</page_no>
                </page>                   
                <subscection_total_pages>4</subscection_total_pages>
            </subsection>  
            <scection_total_pages>4</scection_total_pages>
        </section>    
        <section>       
            <subsection>  
                <page>
                    <content>
                        CONTENT FROM fff.html
                        CONTENT FROM ggg.html
                    </content>
                    <page_no>1</page_no>
                </page>           
                <page>
                    <content>
                        CONTENT FROM hhh.html
                    </content>
                    <page_no>2</page_no>
                </page>            
                <page>
                    <content>
                        CONTENT FROM iii.html
                        CONTENT FROM jjj.html
                    </content>
                    <page_no>3</page_no>
                </page>
                <subscection_total_pages>3</subscection_total_pages>
            </subsection>        
            <subsection>            
                <page>
                    <content>
                        CONTENT FROM kkk.html
                        CONTENT FROM lll.html
                    </content>
                    <page_no>1</page_no>
                </page>           
                <page>
                    <content>
                        CONTENT FROM mmm.html
                        CONTENT FROM nnn.html
                    </content>
                    <page_no>2</page_no>
                </page>           
                <page>
                    <content>
                        CONTENT FROM ooo.html
                        CONTENT FROM ppp.html
                    </content>
                    <page_no>3</page_no>
                </page>           
                <page>
                    <content>
                        CONTENT FROM qqq.html
                    </content>
                    <page_no>4</page_no>
                </page>
                <subscection_total_pages>4</subscection_total_pages>
            </subsection>
            <scection_total_pages>7</scection_total_pages>
        </section>    
    </AllSections>

ありがとう!

4

2 に答える 2

0

これが私の提案です:

   <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
       <xsl:output method="xml" indent="yes"/>
       <xsl:strip-space elements="*"/>

       <xsl:key name="modules" match="module[@group]" use="concat(generate-id(..), '|', @group)"/>

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

       <xsl:template match="section">
         <xsl:copy>
           <xsl:apply-templates select="subsection"/>
           <section_total_pages>
             <xsl:value-of select="
             count(subsection/module[not(@group)]) + 
             count(subsection/module[@group][generate-id() = generate-id(key('modules', concat(generate-id(..), '|', @group))[1])])"/>
           </section_total_pages>
         </xsl:copy>
       </xsl:template>

       <xsl:template match="subsection">
          <xsl:copy>
            <xsl:variable name="groups" select="module[not(@group)] | module[@group][generate-id() = generate-id(key('modules', concat(generate-id(..), '|', @group))[1])]"/>
            <xsl:apply-templates select="$groups"/>
            <subsection_total_pages>
              <xsl:value-of select="count($groups)"/>
            </subsection_total_pages>
          </xsl:copy>
        </xsl:template>


       <!-- NON GROUPED PART -->
       <xsl:template match="module[not(@group)]">
              <page>
               <content>
                <xsl:copy-of select="document(concat('../myfile/', comp))"/>
               </content>
               <xsl:apply-templates select="." mode="page-no"/>
             </page>
       </xsl:template>

       <!--GROUPED PART -->
       <xsl:template match="module[@group]">
           <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>
               <xsl:apply-templates select="." mode="page-no"/>
           </page>
       </xsl:template>

       <xsl:template match="module" mode="page-no">
               <page_no>
                 <xsl:number count="module[not(@group)] | module[@group][generate-id() = generate-id(key('modules', concat(generate-id(..), '|', @group))[1])]"/>
               </page_no>
       </xsl:template>


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

上記のコードをSaxon 6.5.5で入力に適用すると

<root>
    <section>
        <subsection>
            <module>
                <comp>aaa.html</comp>
            </module>
            <module group='group01'>
                <comp>bbb.html</comp>
            </module>
            <module group='group01'>
                <comp>ccc.html</comp>
            </module>
            <module>
                <comp>ddd.html</comp>
            </module>
            <module>
                <comp>eee.html</comp>
            </module>
        </subsection>
    </section>
    <section>
        <subsection>
            <module group ="group02">
                <comp>fff.html</comp>
            </module>
            <module group ="group02">
                <comp>ggg.html</comp>
            </module>
            <module>
                <comp>hhh.html</comp>
            </module>
            <module group ="group03">
                <comp>iii.html</comp>
            </module>
            <module group ="group03">
                <comp>jjj.html</comp>
            </module>
        </subsection>
        <subsection>
            <module group ="group04">
                <comp>kkk.html</comp>
            </module>
            <module group ="group04">
                <comp>lll.html</comp>
            </module>
            <module group ="group05">
                <comp>mmm.html</comp>
            </module>
            <module group ="group05">
                <comp>nnn.html</comp>
            </module>
            <module group ="group06">
                <comp>ooo.html</comp>
            </module>
            <module group ="group06">
                <comp>ppp.html</comp>
            </module>
            <module>
                <comp>qqq.html</comp>
            </module>
        </subsection>
    </section>
</root>

私は結果を得る

<AllSections>
   <section>
      <subsection>
         <page>
            <content/>
            <page_no>1</page_no>
         </page>
         <page>
            <content/>
            <page_no>2</page_no>
         </page>
         <page>
            <content/>
            <page_no>3</page_no>
         </page>
         <page>
            <content/>
            <page_no>4</page_no>
         </page>
         <subsection_total_pages>4</subsection_total_pages>
      </subsection>
      <section_total_pages>4</section_total_pages>
   </section>
   <section>
      <subsection>
         <page>
            <content/>
            <page_no>1</page_no>
         </page>
         <page>
            <content/>
            <page_no>2</page_no>
         </page>
         <page>
            <content/>
            <page_no>3</page_no>
         </page>
         <subsection_total_pages>3</subsection_total_pages>
      </subsection>
      <subsection>
         <page>
            <content/>
            <page_no>1</page_no>
         </page>
         <page>
            <content/>
            <page_no>2</page_no>
         </page>
         <page>
            <content/>
            <page_no>3</page_no>
         </page>
         <page>
            <content/>
            <page_no>4</page_no>
         </page>
         <subsection_total_pages>4</subsection_total_pages>
      </subsection>
      <section_total_pages>7</section_total_pages>
   </section>
</AllSections>

これは正しい合計数を持っているようです。明らかに、それらのファイルを取り込む必要がないため、コンテンツがすべて欠落しています。

于 2012-10-16T14:27:27.147 に答える
0

この XSLT 1.0 スタイルシート...

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" indent="yes" omit-xml-declaration="yes"/>
<xsl:strip-space elements="*" />  

<xsl:key name="kModules" match="module[@group]" use="concat(generate-id(..), '|', @group)"/>

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

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

<xsl:template match="section">
  <xsl:copy>
    <xsl:apply-templates select="@*|node()"/>
    <section_total_pages><xsl:number
       value="count(subsection/module[ not(@group) or 
  (generate-id()=generate-id( key('kModules',concat(generate-id(..),'|',@group))[1]))])"/>
    </section_total_pages> 
  </xsl:copy>
</xsl:template>

<xsl:template match="subsection">
  <xsl:variable name="subsect-id" select="concat(generate-id(),'|')" />
  <xsl:copy>
    <xsl:variable name="page-heads"
    select="module[ not(@group) or 
            (generate-id()=generate-id( key('kModules',concat($subsect-id, @group))[1]))]"/>
    <xsl:apply-templates select="
      @*| node()[not(self::module)] | $page-heads"/>
    <subsection_total_pages><xsl:number value="count($page-heads)"/></subsection_total_pages>
  </xsl:copy>
</xsl:template>  

<xsl:template match="module">
  <xsl:variable name="subsect-id" select="concat(generate-id(..),'|')" />
  <page>
   <content>
     <xsl:apply-templates select="key('kModules',concat($subsect-id, @group))/comp | comp" />
   </content>
   <page_no><xsl:number count="module[not(@group) or 
     (generate-id() =
      generate-id( key('kModules',concat($subsect-id, @group))[1]))]"/></page_no>  
  </page>
</xsl:template>

<xsl:template match="comp">
  <!-- Change this sequence constructor to do your document pulling bit. -->
  <xsl:comment>content from <xsl:value-of select="." /></xsl:comment>
</xsl:template>

</xsl:stylesheet>

...指定されたサンプル入力に適用すると、...

<AllSections>
  <section>
    <subsection>
      <page>
        <content>
          <!--content from aaa.html-->
        </content>
        <page_no>1</page_no>
      </page>
      <page>
        <content>
          <!--content from bbb.html-->
          <!--content from ccc.html-->
        </content>
        <page_no>2</page_no>
      </page>
      <page>
        <content>
          <!--content from ddd.html-->
        </content>
        <page_no>3</page_no>
      </page>
      <page>
        <content>
          <!--content from eee.html-->
        </content>
        <page_no>4</page_no>
      </page>
      <subsection_total_pages>4</subsection_total_pages>
    </subsection>
    <section_total_pages>4</section_total_pages>
  </section>
  <section>
    <subsection>
      <page>
        <content>
          <!--content from fff.html-->
          <!--content from ggg.html-->
        </content>
        <page_no>1</page_no>
      </page>
      <page>
        <content>
          <!--content from hhh.html-->
        </content>
        <page_no>2</page_no>
      </page>
      <page>
        <content>
          <!--content from iii.html-->
          <!--content from jjj.html-->
        </content>
        <page_no>3</page_no>
      </page>
      <subsection_total_pages>3</subsection_total_pages>
    </subsection>
    <subsection>
      <page>
        <content>
          <!--content from kkk.html-->
          <!--content from lll.html-->
        </content>
        <page_no>1</page_no>
      </page>
      <page>
        <content>
          <!--content from mmm.html-->
          <!--content from nnn.html-->
        </content>
        <page_no>2</page_no>
      </page>
      <page>
        <content>
          <!--content from ooo.html-->
          <!--content from ppp.html-->
        </content>
        <page_no>3</page_no>
      </page>
      <page>
        <content>
          <!--content from qqq.html-->
        </content>
        <page_no>4</page_no>
      </page>
      <subsection_total_pages>4</subsection_total_pages>
    </subsection>
    <section_total_pages>7</section_total_pages>
  </section>
</AllSections>

ノート

  1. テンプレート マッチングcompは、テスト目的のためのものです。生産目的では、必要に応じて変更し、行ったように document() 関数を使用します。
  2. Muenchian テストを一致条件に入れることは避けたいと思います。テンプレートの一致テストは頻繁にテストされるため、これは非常に困難です。
  3. あなたの問題のこぶはxsl:numbercount属性を使用して解決されます。これが xsl:number の主な存在理由です。(Martin の最初の投稿とその正しい使い方におめでとう。)
  4. サンプル入力に山かっこがありませんでした。
  5. 私はそれsubscection_total_pagesが subsection_total_pages と綴られることを意図していると思いましたscection_total_pages.

興味深い代替ソリューション

の処理を 2 つのケースに分割する代わりにmodule、すべての に対して有効なキーを発明することができますmodules。この場合、group属性が存在しない場合、キー値はその属性に固有のものでした。@このようなアプローチを採用した次の代替ソリューションでは、generate-id() 関数に二重文字が含まれないことを前提としています。

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" indent="yes" omit-xml-declaration="yes"/>
<xsl:strip-space elements="*" />  

<xsl:key name="kModules" match="module" use="
  concat(generate-id(..),'|',
  substring-before( concat( generate-id(),'@',@group,'@',generate-id()), '@@' ),
  @group)"/>

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

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

<xsl:template match="section">
  <xsl:copy>
    <xsl:apply-templates select="@*|node()"/>
    <section_total_pages><xsl:number
       value="count(subsection/module[  
  (generate-id()=generate-id( key('kModules',
        concat(generate-id(..),'|',
  substring-before( concat( generate-id(),'@',@group,'@',generate-id()), '@@' ),
  @group))[1]))])"/>
    </section_total_pages> 
  </xsl:copy>
</xsl:template>

<xsl:template match="subsection">
  <xsl:variable name="subsect-id" select="concat(generate-id(),'|')" />
  <xsl:copy>
    <xsl:variable name="page-heads"
    select="module[ 
            (generate-id()=generate-id( key('kModules',concat(generate-id(..),'|',
  substring-before( concat( generate-id(),'@',@group,'@',generate-id()), '@@' ),@group))[1]))]"/>
    <xsl:apply-templates select="@*| node()[not(self::module)] | $page-heads"/>
    <subsection_total_pages><xsl:number value="count($page-heads)"/></subsection_total_pages>
  </xsl:copy>
</xsl:template>  

<xsl:template match="module">
  <xsl:variable name="subsect-id" select="concat(generate-id(..),'|')" />
  <page>
   <content>
     <xsl:apply-templates select="key('kModules',concat(generate-id(..),'|',
  substring-before( concat( generate-id(),'@',@group,'@',generate-id()), '@@' ),
  @group))/comp" />
   </content>
   <page_no><xsl:number count="module[
     (generate-id()=generate-id( key('kModules',concat(generate-id(..),'|',
  substring-before( concat( generate-id(),'@',@group,'@',generate-id()), '@@' ),
  @group))[1]))]"/></page_no>  
  </page>
</xsl:template>

<xsl:template match="comp">
  <!-- Change this sequence constructor to do your document pulling bit. -->
  <xsl:comment>content from <xsl:value-of select="." /></xsl:comment>
</xsl:template>

</xsl:stylesheet>

代替ソリューションはどのように機能しますか?

valueキー値で使用される Xpath 式の重要な部分を検討してください

concat(
  substring-before(
    concat( generate-id(), '@' ,@group, '@', generate-id()),
    '@@' ),
  @group
  )

@group が存在しないか空の場合、これは次と同等です...

concat(
  substring-before(
    concat( generate-id(), '@@', generate-id()),
    '@@' ),
  @group
  )

... また ...

concat( generate-id(), @group)

... また ...

generate-id()

...これはノードごとに一意であり、これが必要です。

しかし、@group が空でない場合、これは次と同等です...

concat(
  '',
  @group
  )

... また ...

@group

グループ属性を持つモジュールをグループ化できるようにします。

于 2012-10-16T14:42:00.743 に答える