我是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>
答案 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>