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

时间:2014-03-12 12:19:48

标签: xml xslt

我一直在圈子里跑来跑去。我想计算至少有一个属性发生变化的工人数量。如果名字发生变化,那就是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 。不是这种情况。当我运行示例文件时,我得到了奇怪的结果。我准备使用一个模板并计算该模板的返回 - 但我不确定要匹配什么...我也考虑过分组,但我认为我的规范并不复杂,我需要进入复杂的功能。也许我是天真的。

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

2 个答案:

答案 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])