计算至少一个子节点具有该属性的节点

问题描述 投票:0回答:3

我一直在为此兜圈子。我想统计至少有一项属性发生变化的工人数量。如果名字改变,那就是 1。如果姓氏改变,那就是 1。如果两者都改变,那就是 1。

在我的系统中,更改由具有先前值的节点表示 - 类似于下面(伪):

<!-- XML -->

<Slave_Group>
<Slave>
    <Personal>
        <First_Name PriorValue="John">Jacob</First_Name>
        <Last_Name>Smith</Last_Name>
    </Personal>
</Slave>
<Slave>
    <Personal>
        <First_Name>Mary</First_Name>
        <Last_Name PriorValue="Peterson">O'Reilly</Last_Name>
    </Personal>
</Slave>
<Slave>
    <Personal>
        <First_Name PriorValue="Tim">Eric</First_Name>
        <Last_Name PriorValue="Heidecker">Wareheim</Last_Name>
    </Personal>
</Slave>
</Slave_Group>

以下 XSLT 应用于 XML:

<!-- XSLT -->

<variable name="numNameChanges" select="count(//Slave_Group/Slave/Personal/(First_Name[@PriorValue] or Last_Name[@PriorValue]))"/>

我想要获得的值是 numNameChanges = 3。不是这种情况。当我运行示例文件时,我得到了奇怪的结果。我准备使用模板并计算该模板的返回 - 但我不确定要匹配什么等等...我也考虑过分组,但我认为我的规范并没有那么复杂,我需要进入复杂的状态功能。也许是我太天真了

有没有办法有条件地计算节点数?

xml xslt
3个回答
1
投票

我想你需要这个:

count(//Slave_Group/Slave/Personal[*/@PriorValue])

这会计算所有具有

Personal
属性的子元素的
PriorValue
元素。


0
投票

其中存在几个语法问题,最明显的是多余的括号和

Prior_Value
而不是
PriorValue
。尝试:

count(/Slave_Group/Slave[Personal/First_Name/@PriorValue or Personal/Last_Name/@PriorValue])

0
投票

这个问题我给了5袋爆米花!

© www.soinside.com 2019 - 2024. All rights reserved.