具有相同名称的<users>的Xsl sum()<traffic> </users> </traffic>

时间:2012-07-18 06:27:26

标签: xml xslt

我是xsl的初学者。
我需要计算具有相同名称(名称不是“名称”+“姓氏”)的用户的总流量,例如计算名称为“Jonh”的所有用户的流量总和。并且xsl版本应该只有1.0。
我找到了一个同样问题的主题

  

http://social.msdn.microsoft.com/Forums/eu/xmlandnetfx/thread/c9f09ba6-1c79-43df-bbc2-3966710fff23

我试着用它:

<span>Total: <xsl:value-of select="sum(//user[contains(name,'Jonh')]../traffic)" /></span>

<span>Total: <xsl:value-of select="sum(//user[contains(name,'Jonh')]/traffic)" /></span>

但没有效果。它不计算总和。 任何人都可以帮我找到解决方案。

XML文件

<?xml version='1.0' encoding='UTF-8'?>
<?xml-stylesheet type='text/xsl' href='traffic.xsl'?>
<root>
   <user>
       <name>Jonh Connor</name>
       <traffic>800</traffic>
   </user>
   <user>
       <name>John Kennedy</name>
       <traffic>200</traffic>
   </user>
   <user>
       <name>Jack London</name>
       <traffic>100</traffic>
   </user>
   <user>
       <name>Sema Schlumberger</name>
       <traffic>300</traffic>
   </user>
   <user>
       <name>Jack Vorobey</name>
       <traffic>700</traffic>
   </user>
   <user>
       <name>John Lennon</name>
       <traffic>500</traffic>
   </user>
   <user>
       <name>John Romero</name>
       <traffic>4003</traffic>
   </user>
</root>

2 个答案:

答案 0 :(得分:1)

你的第二个表达方式有效......

 <xsl:value-of select="sum(//user[contains(name,'Jonh')]/traffic)" />

我测试了这个并且它有效。请注意名字中明显的拼写错误:'Jonh'和'John'。

请注意,虽然您的表达式是正确的,但如果您可以依赖示例输入隐含的结构,那么当上下文节点是文档根目录时,您可能更喜欢更有效的解决方案:

 <xsl:value-of select="sum(root/user/name[contains(.,'Jonh')]/../traffic)" />

买者

这种表达形式不区分名称和名称部分。因此,如果你总结'Rom',你会得到4003,因为姓氏'John Romero'包括'Rom'。如果这不是理想的结果,那么您需要澄清匹配规则。

答案 1 :(得分:0)

第二个表达式正常。无论如何,我宁愿从表达式中删除contains()函数,因为它可能导致计算错误。要仅为名为“John”的用户获取结果,您应使用以下示例:

<span>Total: <xsl:value-of select="sum(/root/user[name = 'Jonh']/traffic)" /></span>