2012-07-20 37 views
1

安装程序:我正在使用XPath 2.0。但在Altova Stylevision内部,请稍后参阅我的评论。XPath 2.0:在具有当前节点值的第一个元素之前查找不同元素的数量

我有以下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的位置,然后计算出之前的不同蓝色的数量。

我的问题之一是Altova不支持current()函数。 Quote:“请注意,current()函数是XSLT函数,而不是XPath函数,因此不能用于StyleVision的自动计算和条件模板中。要选择表达式中的当前节点,请使用for表达式的XPath 2.0。 “

因此,任何解决方案,可以做到无电流()函数将是巨大的;)

谢谢大家!

斯特沃

+0

就像一个小小的评论,我设法计算(distinct-values(../ preceding-sibling :: bla/blub)),但显然不是从第一个节点开始,具有相同的值当前节点,而是从当前节点开始。以为我会张贴它的情况下,它可以帮助... – spse 2012-07-20 09:54:40

回答

0

如果需要使用相同的值的第一个节点,你总是可以从头开始,并与/entries/bla[blub=string()][1]搜索。 (无参数字符串应该返回当前节点的值)

然后你就可以在你的表情插入,并得到

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

如果你需要它的所有blubs,你可以指望它为所有的他们:

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

编辑:它可能会慢,执行,如此多的循环。如果Stylevision中的distinct值保留了元素的顺序,则值之前的元素数是该不同值序列中某个值的索引。

这样你就可以计为一个节点与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 
+0

谢谢你的答案!当使用你的建议时,Altova似乎不支持string()函数:index-of(distinct-values(/ entries/bla/blub),string()) - 1 string()位不返回当前节点的值。但是:对于$ x in。 (不同值(/ entries/bla/blub),$ x)-1的返回索引做到这一点,所以解决方法似乎存在。 – spse 2012-07-20 13:25:07

相关问题