1

次の xml (私の CV を含む大きなファイルの一部) の tei:div 要素を 2 つごとにグループ化し、それらを<div type="reference_block">:

     <div type="category">
        <head n="references">References</head>
        <div type="reference" xml:id="1">
              <persName>
                 <forename type="first">firstname1</forename>
                 <surname>surname1</surname>
              </persName> 
           <address>
                 <name type="building">building1</name>
                 <postBox>postbox1</postBox>
                 <placeName>
                    <settlement>settlement1</settlement>
                    <region>region1</region>
                    <country>country1</country>
                 </placeName>
                 <postCode>postcode1</postCode>
           </address>
           <num n="telephone">telephone1</num>
           <email>email1</email>
        </div>
        <div type="reference" xml:id="2">
              <persName>
                 <forename type="first">firstname2</forename>
                 <surname>surname2</surname>
              </persName> 
           <address>
                 <name type="building">building2</name>
                 <postBox>postbox2</postBox>
                 <placeName>
                    <settlement>settlement2</settlement>
                    <region>region2</region>
                    <country>country2</country>
                 </placeName>
                 <postCode>postcode2</postCode>
           </address>
           <num n="telephone">telephone2</num>
           <email>email2</email>
        </div>
        <div type="reference" xml:id="3">
              <persName>
                 <forename type="first">firstname3</forename>
                 <surname>surname3</surname>
              </persName> 
           <address>
                 <name type="building">building3</name>
                 <postBox>postbox3</postBox>
                 <placeName>
                    <settlement>settlement3</settlement>
                    <region>region3</region>
                    <country>country3</country>
                 </placeName>
                 <postCode>postcode3</postCode>
           </address>
           <num n="telephone">telephone3</num>
           <email>email3</email>
        </div>
        <div type="reference" xml:id="4">
              <persName>
                 <forename type="first">firstname4</forename>
                 <surname>surname4</surname>
              </persName> 
           <address>
                 <name type="building">building4</name>
                 <postBox>postbox4</postBox>
                 <placeName>
                    <settlement>settlement4</settlement>
                    <region>region4</region>
                    <country>country4</country>
                 </placeName>
                 <postCode>postcode4</postCode>
           </address>
           <num n="telephone">telephone4</num>
           <email>email4</email>
        </div>
        <div type="reference" xml:id="5">
              <persName>
                 <forename type="first">firstname5</forename>
                 <surname>surname5</surname>
              </persName> 
           <address>
                 <name type="building">building5</name>
                 <postBox>postbox5</postBox>
                 <placeName>
                    <settlement>settlement5</settlement>
                    <region>region5</region>
                    <country>country5</country>
                 </placeName>
                 <postCode>postcode5</postCode>
           </address>
           <num n="telephone">telephone5</num>
           <email>email5</email>
        </div>
        <div type="reference" xml:id="6">
              <persName>
                 <forename type="first">firstname6</forename>
                 <surname>surname6</surname>
              </persName>
           <address>
                 <name type="building">building6</name>
                 <postBox>postbox6</postBox>
                 <placeName>
                    <settlement>settlement6</settlement>
                    <region>region6</region>
                    <country>country6</country>
                 </placeName>
                 <postCode>postcode6</postCode>
           </address>
           <num n="telephone">telephone6</num>
           <email>email6</email>
        </div>
        <div type="reference" xml:id="7">
              <persName>
                 <forename type="first">firstname7</forename>
                 <surname>surname7</surname>
              </persName>
           <address>
                 <name type="building">building7</name>
                 <postBox>postbox7</postBox>
                 <placeName>
                    <settlement>settlement7</settlement>
                    <region>region7</region>
                    <country>country7</country>
                 </placeName>
                 <postCode>postcode7</postCode>
           </address>
           <num n="telephone">telephone7</num>
           <email>email7</email>
        </div>
     </div>

このテンプレートを使用して、アイテムをラップしようとしています:

 <xsl:template match="tei:div[@type='reference']">
    <xsl:if test="@xml:id mod 2 = 1">
        <div class="reference_block">
            <xsl:apply-templates select=".|following-sibling::tei:div[@type='reference'][@xml:id &lt; 2]"/>
        </div>
       </xsl:if>
    </xsl:template>

ただし、そうすると、「ネストされた apply-templates 呼び出しが多すぎます。スタイルシートがループしている可能性があります」というエラー メッセージが表示されます。

問題は「。」にあるようです。私の選択では、エラーメッセージが表示される理由がわかりません。多分それはそれが自分自身を呼んでいて、私がそれに気づいていないからですか?なぜこれが起こっているのか、または「。」を必要としないアイテムをグループ化する別の方法について、誰かが私に洞察を与えることができますか? 選択する?ありがとう!

4

1 に答える 1

1

これは現在のコンテキスト ノード (つまり、現在一致しているdiv"."ノード) を表しているため、実際に問題を引き起こしているため、それを選択すると同じテンプレートが一致し、テンプレート内では依然として true になり、先頭に表示されます。無限再帰へ。test="@xml:id mod 2 = 1"

現在のdivと次のdivをコピーするだけの場合は、代わりにxsl:apply-templatesxsl:copy-ofに置き換えてください。次の兄弟を取得するための表現も正しくないことに注意してください。次の要素のIDと現在の要素のIDを比較したい

これを試して...

 <xsl:copy-of select=".|following-sibling::tei:div[@type='reference'][@xml:id &lt; current()/@xml:id + 2]"/>

または、ID が常に順番どおりになる場合は、これも機能します。

<xsl:copy-of select=".|following-sibling::tei:div[@type='reference'][1]"/>

一方、選択しているdiv要素のペアに対してさらに変換を行いたい場合は、モード属性を利用できるため、別のテンプレートが一致します

<xsl:template match="tei:div[@type='reference']">
   <xsl:if test="@xml:id mod 2 = 1">
      <div class="reference_block">
        <xsl:apply-templates select=".|following-sibling::tei:div[@type='reference'][1]" mode="group"/>
      </div>
   </xsl:if>
</xsl:template>

<xsl:template match="tei:div" mode="group">
    <!-- Other code here -->
</xsl:template>
于 2014-07-17T17:06:21.273 に答える