0

我是 xsl 的初学者。
我需要计算同名用户的总流量(name NOT "name" + "last name"),例如计算所有名为 "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 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>
4

2 回答 2

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”。如果这不是想要的结果,那么您需要阐明匹配规则。

于 2012-07-18T06:40:00.387 回答
0

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

<span>Total: <xsl:value-of select="sum(/root/user[name = 'Jonh']/traffic)" /></span>
于 2012-07-18T06:51:36.720 回答