2014-03-12 70 views
0

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

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

+1

希望有一点小问题,但为了政治上的正确性,您可能需要澄清数据的上下文。我非常希望这是某种历史记录。 – Flynn1179

回答

0

您在那里有几个语法问题,最显着的是多余的括号,而Prior_Value而不是PriorValue。尝试:

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

感谢您的帮助。这适用于我想要的。将试验方括号的位置以获得更好的理解。 – JohnoAvocado

+0

方括号内的任何内容都是谓词(测试)。我们正在计算通过测试的'Slave'元素。这里的测试是存在一个特定的后代节点。该节点的路径与正在测试的节点相关。 –

1

我认为你需要这样的:

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

这会计算有一个PriorValue属性的任何子元素任何Personal元素。

相关问题