我一直在为此兜圈子。我想统计至少有一项属性发生变化的工人数量。如果名字改变,那就是 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。不是这种情况。当我运行示例文件时,我得到了奇怪的结果。我准备使用模板并计算该模板的返回 - 但我不确定要匹配什么等等...我也考虑过分组,但我认为我的规范并没有那么复杂,我需要进入复杂的状态功能。也许是我太天真了
有没有办法有条件地计算节点数?
我想你需要这个:
count(//Slave_Group/Slave/Personal[*/@PriorValue])
这会计算所有具有
Personal
属性的子元素的 PriorValue
元素。
其中存在几个语法问题,最明显的是多余的括号和
Prior_Value
而不是 PriorValue
。尝试:
count(/Slave_Group/Slave[Personal/First_Name/@PriorValue or Personal/Last_Name/@PriorValue])
这个问题我给了5袋爆米花!