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>

在解析我的文件时,我想在每次出现 blub 时知道:在第一次出现与当前节点具有相同值的 blub 之前,有多少个不同的 blub 值。

所以基本上首先确定与当前节点具有相同值的blub的第一次出现在哪里,然后计算出之前不同blub的数量。

我的问题之一是 Altova 不支持 current() 函数。引用:“请注意,current() 函数是 XSLT 函数,而不是 XPath 函数,因此不能在 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 ))

如果你需要它来处理所有的 blubs,你可以为所有的 blubs 计算它:

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

编辑:但是执行起来可能很慢,所以循环很多。如果该 Stylevision 中的 distinct-values 保留元素的顺序,则值之前的元素数是该值在不同值序列中的索引。

所以你可以计算一个节点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 回答