计算XSLT中每个父级的不同的第一个子值元素

时间:2018-07-17 15:46:36

标签: xml xslt xpath xslt-1.0

使用XSLT样式表,我试图为父元素的每个第一个子节点计算不同的值。

示例XML:

<Root>
<Parent>
    <Child>
            <Child2>
              <Child3>Value2</Child3>
            </Child2>
    </Child>
    <Child>
            <Child2>
              <Child3>Value3</Child3>
            </Child2>
    </Child>
</Parent>
 <Parent>
    <Child>
            <Child2>
              <Child3>Value2</Child3>
            </Child2>
    </Child>
    <Child>
            <Child2>
              <Child3>Value2</Child3>
            </Child2>
    </Child>
</Parent>
 <Parent>
    <Child>
            <Child2>
              <Child3>Value2</Child3>
            </Child2>
    </Child>
    <Child>
            <Child2>
              <Child3>Value2</Child3>
            </Child2>
    </Child>
</Parent>
</Root>

使用我上面的XML示例,预期结果将为1。 通过使用count函数,我设法为所有子项计算了不同的值,但我不知道如何为每个第一个子项进行计算。

count(//Parent/Child/Child2/Child3[not(.=following::Child3)])

1 个答案:

答案 0 :(得分:1)

您想要的表情是这个...

<xsl:value-of select="count(//Parent/Child[1]/Child2/Child3[not(.=following::Parent/Child[1]/Child2/Child3)])" />

不是很优雅或效率很高。

但是您已将其标记为XSLT 1.0,这表明您正在样式表中执行计数。如果是这样,请考虑如下定义键:

 <xsl:key name="children" match="Parent/Child[1]/Child2" use="Child3" />

然后表达式变成这个。...

 <xsl:value-of select="count(//Child2[generate-id() = generate-id(key('children', Child3)[1])])" />

这利用了一种Muenchian Grouping的技术,值得一读。