4

私は xslt バージョン 2 を使用しています。xml を fo 出力に変換しようとしていますが、特定の問題で立ち往生しています。

これが私の入力のように見えるものです:

    <a1/>
    <a1/>
    <b/>
    <c/>
    <d/>
    <a2/>
    <b/>
    <c/>
    <a1/>
    <a1/>
    <a1/>
    <a1/>
    <b/>
    <c/>
    <d/>

このデータは、機能的に言​​えば、a1|a2,b?,c?,d? によって定義された「セット」のリストを含みます。

私の問題は、特定の「セット」の a1 タグの数をカウントする方法がわからないことです。

実際、私は自分の xsl を書き、次のような出力を得ました。

<fo:table>
    <fo:row>
        <fo:cell>b: </fo:cell>
        <fo:cell>b value</fo:cell>
    </fo:row>
    <fo:row>
        <fo:cell>a1: </fo:cell>
        <fo:cell>number of a1 ???</fo:cell> <-- what I am trying to retrieve
    </fo:row>
    <fo:row>
        ...
    </fo:row>
    ...
</fo:table>

a1+|a2 タグでテンプレートの適用を実行しましたが、a1 タグに a1 と等しい次の兄弟がある場合は何もしません。前の兄弟でタグを数える方法があるに違いないと思います(しかし、対応するものだけを確実に数えるにはどうすればよいですか?)

ヒントをいただければ幸いです。

編集: 上記の入力例では、最初のカウントは 2 である必要があります。

    <a1/>
    <a1/>
    <b/>
    <c/>
    <d/>

次に、6 ではなく 4 にする必要があります。

    <a1/>
    <a1/>
    <a1/>
    <a1/>
    <b/>
    <c/>
    <d/>
4

3 に答える 3

9

あなたの質問は本当に明確ではありません。「対応するもの
」とは 何ですか?現在のものより前のすべてをカウントすると、次のようになります。a1

 count(preceding-sibling::a1) 

必要に応じて、次のような述語を追加できます。

 count(preceding-sibling::a1[/corresponding one/]) 

一連の a1 ノードにある主要な兄弟 a1 のみをカウントするには、次のようにします。 a1 ではない最初のノードを見つけます。

<xsl:variable name="firstnota1" select="preceding-sibling::*[not (self::a1)][1]" />

これよりも優れた結果は、現在の a1 の前のすべてのノードをカウントし、最初の not a1 + このノード自体の前のノードの数を引いたものです。

<xsl:value-of select="count(preceding-sibling::*) 
       -  count($firstnota1/preceding-sibling::* | $firstnota1)"/>

または変数なし:

<xsl:value-of 
      select="count(preceding-sibling::*)
             -  count( preceding-sibling::*[not (self::a1)][1]
                      /preceding-sibling::*
                      | preceding-sibling::*[not (self::a1)][1] )"/>
于 2013-07-13T13:53:50.983 に答える