1

セットアップ: XPath 2.0 を使用しています。ただし、Altova Stylevision 内では、後で私のコメントを参照してください。

次の XML 構造を取得しました。

    <?xml version="1.0" encoding="UTF-8"?>
    <entries>
        <bla>
            <blub>222</blub>
        </bla>
        <bla>
            <blub>222</blub>
        </bla>
        <bla>
            <blub>123</blub>
        </bla>
        <bla>
            <blub>234</blub>
        </bla>
        <bla>
            <blub>123</blub>
            <!--I want to find the number of distinct elements before the first occurance of a blub element with the same value as the current node - so for this node the result should be one (two times 222 before the first appearance of 123)-->
        </bla>
    </entries>

I ファイルを解析するとき、ブロブが出現するたびに知りたいと思います。現在のノードと同じ値を持つブロブが最初に出現する前に、ブロブの個別の値がいくつあるか。

したがって、基本的には、最初に現在のノードと同じ値を持つ blub が最初に出現した場所を特定し、それから前の個別の blub の数を計算します。

私の問題の 1 つは、Altova が current() 関数をサポートしていないことです。引用: 「current() 関数は XPath 関数ではなく XSLT 関数であるため、StyleVision の自動計算および条件付きテンプレートでは使用できないことに注意してください。式で現在のノードを選択するには、XPath 2.0 の for 式を使用します。 "

したがって、 current() 関数なしで実行できるソリューションはどれも素晴らしいでしょう;)

皆さんありがとう!

ステボ

4

1 に答える 1

0

同じ値の最初のノードが必要な場合は、いつでも最初から始めて、で検索できます/entries/bla[blub=string()][1]。(パラメーターのない文字列は、現在のノードの値を返す必要があります)

そして、それを式に挿入して、

count(distinct-values( /entries/bla[blub=string()][1]/preceding-sibling::bla/blub ))

そして、あなたがすべてのブラブのためにそれを必要とするならば、あなたはそれらすべてのためにそれを数えることができます:

for $x in /entries/bla/blub return count(distinct-values( /entries/bla[blub=string($x)][1]/preceding-sibling::bla/blub ))

編集:ただし、実行に時間がかかる可能性があるため、ループが多くなります。そのStylevisionのdistinct-valuesが要素の順序を保持している場合、値の前の要素の数は、distinctvalueシーケンス内のその値のインデックスです。

したがって、を使用して1つのノードをindex-of(distinct-values(/entries/bla/blub), string()) - 1カウントし、を使用してすべてのノードをカウントできます。

for $x in /entries/bla/blub return index-of(distinct-values(/entries/bla/blub), $x) - 1

また、新しい変数を定義できる場合は、$ sをに設定し、次のようdistinct-values(/entries/bla/blub)に簡略化できます。

for $x in /entries/bla/blub return index-of($s, $x) - 1
于 2012-07-20T12:43:07.117 に答える