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