首页 文章

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

提问于
浏览
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 回答

  • 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的技术,值得一读 .

相关问题